前后查找/零宽断言

2017-12-14 16:47:52
linefo
975
最后编辑:linefo 于 2017-12-14 23:49:49



这也是非常重要的功能!
大部分环境都支持向前查找,但部分不支持向后查找(如JavaScript)


还是先由实例出发,看下面这两个url地址:


http://www.a.com/
https://www.b.com/


【例子】.+:

(这个例子找到了 http: 和 https:)


问题来了,我只想要 : 前面的部分,即(http 和 https),要怎么写?

这时使用向前查找是个很好的选择!


向前查找


【例子】.+(?=:)


我们使用 (?=) 来实现向前查找,= 后面是寻找的字符/表达式,寻找的应该说 只是一个位置(其实有返回结果,但结果的字节长度是0,这应该是也叫作“零宽断言”的原因)


下面的例子可以看到有返回结果,但字节长度为0



.+(?=:) 这个表达式中, 流程是,先使用 .+ 从前到后寻找,然后 (?=:) 告诉表达式,寻找到 : 这里就停了。


向后查找


PS:不同环境中,对向后查找的支持性较差。

和向前查找理解起来类似


【例子】(?<=:).+

(使用 .+ 从后向前寻找,找到 : 这里就停了)


向前查找和向后查找配合使用


【例子】(?<=(<h1>)).*(?=(</h1>))


负前后查找



这个不太常用
一般来说,支持 向前/向后查找的环境,也会支持 负向前/负向后查找

(?=):向前查找

(?!):负向前查找

(?<=):向后查找

(?<!):负向后查找



看几个例子

【例子】(?<=\$)\d+

(向后查找,前面看懂了的话,会很容易理解)


【例子】(?<!\$)\d+

(这是负向后查找,代表向后查找的反义,即不是以$作为开始位置的数字)


上面的例子还找到了0,这不是我们想要的结果,但它符合上面的表达式(即不以$作为开始位置)

我们再改造一下:


【例子】\b(?<!\$)\d+\b

(加上单词边界后,0这个结果就不会搜索到,单词边界的概念回去翻前面的内容)


负向前查找也是这么理解的,就不多说了