对于零宽度断言的理解

1 篇文章 0 订阅

零宽度的意思是这个表达式不匹配任何字符。
比如正则表达式中^, $, \b,并不匹配任何字符,它们只是表示要匹配的字符的两头满足这个条件。

^abc$’表示要匹配的中间条件abc,表示在字符串的开头这个缝隙后面是abc,而字符串的结尾这个缝隙前面是abc。

我们知道\babc\b可以匹配abc这个的单词,也可以匹配@abc*.也就是说’\b’表示这个间隙一边是单词的部分(字母或数字),一边是非单词(其他任何符号),这个顺序是任意的。但它不匹配任何字符,也不占据任何匹配空间。

‘\babc\b\babc\b’看起来像是匹配两个abc,且这两个abc分别是单独的单词。 看起来像是可以匹配以下的字符串’abc abc’。但实际上不能匹配

我们分析一下,’\b’表示这个间隙一边是单词的部分,一边是非单词。
但它不匹配任何字符,也不占据任何匹配空间。也就是说‘\babc\b\babc\b’这个表达式的意思就是我要匹配两个abc,且这两个abc之间又有非单词部分隔开,

然而非单词部分又不存在,所以这个表达式是矛盾的。
所以上面的’abc abc’其实中间的空格并没有被任何匹配符号匹配到。所以在‘\babc\b\babc\b’中间添加一个空格符就可以了‘\babc\b \babc\b’

以下的是重点:
对于零宽度断言,网上有些说的不是很清楚。
正向预搜索:

“(?=exp)”意思是所在缝隙的右侧必须能够匹配exp这部分的表达式。
“(?!=exp)”意思是所在缝隙的右侧必须能够没有匹配exp这部分的表达式。

举例:Java (?=Shell|Script)匹配“Java JavaBean JavaShell JavaScipt”时只会匹配JavaShell和JavaScript这两个单词的Java部分,
而不会匹配后面。这个匹配式的意思是,匹配’Java’这个四个字母,(?=Shell|Script)这个缝隙右侧必须是Shell或者Script.也就等价于Java后面带了这个两个字符串中的一个。

举例:表达式 “(\w)((?=\1\1\1)(\1))+“ 在匹配字符串 “aaa ffffff 999999999” 时,将可以匹配6个”f”的前4个,可以匹配9个”9”的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。
这个匹配式的意思是,先匹配一个字母或数字,作为组1,然后组2中,有一个零宽度断言’(?=\1\1\1)’,它的意思是这个缝隙的右边要有三个组1的内容,
但是它不占用匹配任何字符。然后断言后面的(\1)表示断言的后面有一个组1的内容,这个匹配其实是在断言的内容里的。
以ffffff为例,(\w)先匹配了f,然后接下来的匹配中,
每匹配一个f,那么f的前面这个缝隙后面要有3个f(新匹配的f也在里面),
也就是说这个f后面要有两个f。所以匹配到ffff时,就停下来了。


参考:http://www.regexlab.com/zh/regref.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值