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

  • 相关阅读:
    sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID
    详细说明XML分解(两)—DOM4J
    JSP简单的练习-用户登记表
    设计师给了px显着的单位,Android要设置多少开发商dip、dp、sp?
    左右xcode的重构选项的一些理解
    unicode下一个,读取数据库乱码问题
    java中间==、equals和hashCode差额
    MIPS台OpenWrt在系统内的路由器Rust应用程序开发
    Android采取async框架文件上传
    ios-上拉电阻负载许多其他接口
  • 原文地址:https://www.cnblogs.com/boundless-sky/p/7597631.html
Copyright © 2011-2022 走看看