正则表达式练习笔记

看到[ ] 字符组(Character Classes) 这节,最后的例子,突然想到,如何来匹配不包含“abc”子字符串的字符串。写来写去,还就是写不出来,照猫画虎,写了个^.*(?!abc).*(?!abc)$,看起来应该可以,跑出来不是那么回事。对于如下的输入:

abcklkjlkjk
lkjljalkl
kjlkabclk
lkjlkjlabc
kljkla
kljkljlj

可以判读出"abcklkjlkjk"和"lkjlkjlabc",但对于"kjlkabclk"这种子字符串在中间的情况,就不能解决。想着用个逆序否定,^.*(?!abc).*(?<!abc)(?!abc)$,结果还是一样。

最后,在这里使用正则表达式找出不包含特定字符串的条目找到了解决方法:

当正则引擎解析到A区域的时候,就已经开始执行B区域的前瞻工作。这个时候发现当A区域为Null的时候匹配成功——.*本来就允许匹配空字符,前瞻条件又满足,A区域后面紧跟着的是“lkj”字符串,而并不是abc。因此整个匹配过程成功匹配到所有条目。

于是,要把开头的.*移到否定表达式里面,变成^(?!.*abc).*(?!abc)$,就可以了,优化一下就是^(?!.*abc).*$,因为(?!.*abc)已经包括了开头为任意字符,后面跟着abc的情况。

看的时候觉得差不多明白,要用的时候才发现,解决不了多少问题,还需要多练习啊。

原文地址:https://www.cnblogs.com/kofkyo/p/2297290.html