• 正则表达式之正向预查和反向预查


    1.正向预查

    现在,我们假设需要仅匹配 Windows,不匹配后面的版本号,并且要求 Windows 后面的版本号只能是 数字类型,换言之,XP 和 Vista 不能被匹配,
    在正则表达式中,可以使用 正向预查 来解决这个问题。本例中,写法是:“Windows(?= [d.]+)”。
    它的语法是在 子模式内部 前面加“?=”,表示的意思是:首先,要匹配的文本必须满足此子模式前面的表达式(本例,“Windows ”);其次,此子模式不参与匹配。

    Text:
    Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively.
    Windows 95 and Windows 98 are the successor.
    Then Windows 2000 and Windows Xp appeared.
    Windows Vista is the Latest version of the family.

    RegEx:
    Windows( ?=[d.]+)

    Result:(带下划线的为成功匹配的)
    Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively.
    Windows 95 and Windows 98 are the successor.
    Then Windows 2000 and Windows Xp appeared.
    Windows Vista is the Latest version of the family.


    可以将 正向预查 理解成为自定义的边界(),这个边界位于表达式末。
    反言之,你可以将位于表达式末的  理解成非获取匹配的一个特例:(?=[ ,. <>;-])。注意,这里没有写全边界符号。
    Text:
    aaaax-aaa 

    aaaaxaaaa

    RegEx:
    x(?=[,. <>;-])

    Result:
    aaaax-aaa
    aaaaxaaaa
    你也可以这样理解上面的匹配过程:
    1. 先进行普通匹配:Windows ([d.]+)
    2. 然后从匹配文本中将 子模式 内的文本排除掉。

    2.反向预查

    在上面的例子中,我们知道 正向预查 类似于自定义的 位于文本末 的字符边界。那么自然应该有位于文本首的情况,比如说,我们要匹配下面文本中属于 CNY 的金额:

    Text:
    CNY: 128.04
    USD: 22.5
    USD: 23.5
    HKD: 1533.5
    CNY: 23.78

    RegEx:
    CNY: d+.d+

    Result:
    CNY: 128.04 

    USD: 22.5 

    USD: 23.5 

    HKD: 1533.5 

    CNY: 23.78

    与上面类似,我们现在要求仅匹配金额,而不匹配前面的 “CNY:”
    正则表达式中,可以使用 反向预查 来解决这个问题。本例中,写法是:(?<=CNY: )d+.d+
    反向预查 的语法是在子模式内部前面加“?<=”,表示的意思是:首先,要匹配的文本必须满足此子模式 后面 的表达式(本例,“d+.d+”);其次,此子模式不参与匹配。
    Text:
    CNY: 128.04
    USD: 22.5
    USD: 23.5
    HKD: 1533.5
    CNY: 23.78
    Page 39 of 42
    RegEx:
    (?<=CNY: )d+.d+
    Result:
    CNY: 128.04 

    USD: 22.5 

    USD: 23.5 

    HKD: 1533.5 

    CNY: 23.78
    与前面类似:你可以将 反向预查 理解成为自定义的边界(),这个边界位于 表达式首。
    反言之,你可以将位于 表达式首 的  理解成一个非获取匹配的一个特例:(?<=[ ,. <>;-])。注意,我没有写全所有边界。
    Text:
    aaa-xaaaa
    aaaxaaaaa
    RegEx:
    (?<=[,. <>;-])x
    Result:
    aaa-xaaaa
    aaaxaaaaa
    你也可以这样理解上面的匹配过程:
    1. 先进行普通匹配:(CNY: )d+.d+
    2. 然后从匹配文本中将 子模式 内的文本排除掉。

  • 相关阅读:
    杭电 Problem
    杭电Problem 5053 the sum of cube 【数学公式】
    杭电 Problem 2089 不要62 【打表】
    杭电 Problem 4548 美素数【打表】
    杭电 Problem 2008 分拆素数和 【打表】
    杭电 Problem 1722 Cake 【gcd】
    杭电 Problem 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心】
    杭电Problem 1872 稳定排序
    杭电 Problem 1753 大明A+B
    东北林业大 564 汉诺塔
  • 原文地址:https://www.cnblogs.com/boundless-sky/p/7597631.html
Copyright © 2020-2023  润新知