zoukankan      html  css  js  c++  java
  • 正则表达式之正向预查和反向预查

    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. 然后从匹配文本中将 子模式 内的文本排除掉。

  • 相关阅读:
    WPF数据绑定之Ado.net的数据库连接绑定
    asp.net 网站js弹出提示后原页面css样式丢失
    Javascript中函数重载的实现
    JavaScript的继承
    WPF数据绑定之4种绑定模式
    Asp.net输出Excel文件并且下载该文件以及某些细节问题解决
    js 验证身份证 带X
    WPF的数据绑定之控件源绑定以及代码方式绑定
    WPF数据绑定之DataContext
    在无cookie模式中,会话话状态的ID将会自动保存在ASP.NET的查询字符串中
  • 原文地址:https://www.cnblogs.com/boundless-sky/p/7597631.html
Copyright © 2011-2022 走看看