零宽断言
我们已经讨论了前两种语法。第三个 (?:exp) 不会改变正则表达式的处理方式, 只是这样的组匹配的内容 不会像前两种那样被捕获到某个组里面,也不会拥有组
号 。“我为什么会想要这样做?”——好问题,你觉得为什么呢?
接下来的四个用于查找在某些内
容(但并不包括这些内容)之前或之后 的东西,也就是说它们像 \b , ^ , $ 那 样用于指定一个位置,这个位置应该 满足一定的条件(即断言),因此它们 也被称为 零宽断言 。最好还是拿例 子来说明吧:
地球人,是不是觉得这些术语名称太 复杂,太难记了?我也有同感。知道有这 么一种东西就行了,它叫什么,随它去 吧!人若无名,便可专心练剑;物若无 名,便可随意取舍……
(?=exp) 也叫 零宽度正预测先行
断言 ,它 断言自身出现的位置的后 面能匹配表达式exp 。比如 \b\w (?
=ing\b) ,匹配 以ing结尾的单词的前
断言用来声明一个应该为真的事实。 正则表达式中只有当断言为真时才会继续 进行匹配。
面部分(除了ing以外的部分) ,如查找 I'm singing while you're dancing. 时,它会匹配
sing 和 danc 。
(?<=exp) 也叫 零宽度正回顾后发断言 ,它 断言自身出现的位置的前面能匹配表 达式exp 。比如 (?<=\bre)\w \b 会匹配 以re开头的单词的后半部分(除了re以外的部
分) ,例如在查找 reading a book 时,它匹配 ading 。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你 可以这样查找需要在前面和里面添加逗号的部分: ((?<=\d)\d{3}) \b ,用它对
1234567890 进行查找时结果是 234567890 。
下面这个例子同时使用了这两种断言: (?<=\s)\d (?=\s) 匹配 以空白符间隔的数 字(再次强调,不包括这些空白符) 。