美文网首页
正则表达式之 "正向否定预查"

正则表达式之 "正向否定预查"

作者: 海边的贝壳林 | 来源:发表于2017-10-20 10:58 被阅读0次

这篇文章写的不够透彻.. 需要重新写一下.

记录一些比较有技巧性的用法

正向否定/肯定预查

  • 匹配以/wiki/开头, 后面不包含:, 的字符串. 写法如下:
    ^(/wiki/)((?!:).)*$
    前面的^(/wiki/)是比较好理解的, 就是以/wiki/开头, 但是后面的((?!:).)*是什么意思呢?
    这就需要先了解一个PCRE表达式: (?!pattern)正向否定预查(negative assert), 维基百科中的解释是:
  • 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
  • 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

x(?!:)意思就是x的后面没有:, 那么如果这么说的话, 他应该可以成功匹配形如xy, xx等字符串了? 并不是的. 注意上文维基百科解释中的最后一句话, 预查不消耗字符, 也就是说(?!:)只是表达了后面不能跟:, 但是并不代表xy中的y, 所以正确的表达式是形如x(?!:).x(?!:)\w这种, 让.\w来代表xy中的y. 具体可以看下图:

无法匹配
成功匹配

现在, 应该了解了(?!:).的意义了, 即一个不是:的字符, 然而我们要匹配的是零个一个或多个不是:的字符串, 那么应该怎么做呢? (?!:).*或者(?!:).+么, 这样显然也是不行的. 这样只能保证第一个不是:. 正确的应该是((?!:).)*. 把(?!:).包在一起. 在一起之后我们可以把他俩看成描述一个字符的表达式, 就是我们刚刚说的一个不是:的字符. 那么在其后跟着个*就代表了零个或多个不是:的字符.
那么这个表达式稍微复杂的部分就解释完啦.

参考
维基百科


了解如下表达式:

匹配某字符串, 其后面是/不是xxx的:
(?!) - negative lookahead
(?=) - positive lookahead
匹配某字符串, 其前面是/不是xxx的:
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group

字符串例子: foobarbarfoo

  • 匹配后面是`bar`的字符串`bar`
    同上, 匹配后面是`barfo`的字符串`bar`
  • 匹配后面不是`bar`的字符串`bar`

.

相关文章

  • 正则表达式之 "正向否定预查"

    这篇文章写的不够透彻.. 需要重新写一下. 记录一些比较有技巧性的用法 正向否定/肯定预查 匹配以/wiki/开头...

  • 正则的正向预查和负向预查

    一、(?=pattern)正向预查 : 所谓正向预查就是 ,在任何匹配 pattern 的字符串开始处匹配查找字符...

  • 利用正则表达式把100000000转换成100.000.000

    首先,我们得用到正向预查,代码大致如下: 简单解释下,如果解释的不好,不要介意。首先那个?=就是正向预查里面的内容...

  • 6. 正向预查、贪婪与非贪婪

    正向预查 x(?=y) 匹配x后跟着y的字符串,这种向后匹配的方式叫做正向预查。 贪婪模式&非贪婪模式 贪婪模式应...

  • javascript正则表达式-----正向预查

    前几篇有用到过, 但是未做深入学习,发现一篇很好的博文转载自 javascript--正向预查 什么是正向预查?这...

  • 27,正则表达式3-速查

    正向预搜索 "(?=xxxxx)","(?!xxxxx)"反向预搜索 "(?<=xxxxx)","(?

  • 模式匹配

    正向查找/,反向查找? 正则查找\v,原义查找\V 1. 大小写敏感设置 2.括号转义 3.正则表达式查找、原义查...

  • 正则

    \u4e00-\u9fa5匹配汉字 反向否定预查匹配.js,不匹配.worker.js.*(?

  • php正则 非捕获元 "?:" "

    其中?:是非捕获元之一,还有两个非捕获元是?=和?! 这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内...

  • 正则表达式整理

    正则表达式 ()的使用 组合和限制字符 正向和反向查询 正则常用案例

网友评论

      本文标题:正则表达式之 "正向否定预查"

      本文链接:https://www.haomeiwen.com/subject/hzbmuxtx.html