正则表达式——环视(零宽断言)

环视
也叫零宽断言
它匹配的是一个位置,该位置必须满足零宽断言条件,才能继续往下进行匹配。
由于位置不是字符,它是没有宽度的,所以叫做零宽断言。

环视分为4种情况,概念是想通的,用哪种需要根据自己的需求来决定:
否定逆序环视(? 肯定逆序环视(?<=)
否定顺序环视(?!)
肯定顺序环视(?=)

否定逆序环视:在这个位置的前边(逆序),不能有(否定)条件给出的字符串
肯定逆序环视:在这个位置的前边(逆序),必须是(肯定)条件给出的字符串
否定顺序环视:在这个位置的后边(顺序),不能有(否定)条件给出的字符串
肯定顺序环视,在这个位置的后边(顺序),必须是(肯定)条件给出的字符串

举例
1234567890
比如给这一串数字转为英文的写法,需要每三位加一个逗号。
那么我们就需要找到这样的位置。
这个位置有什么规律呢,每个逗号后边必须有3的倍数个数字,且个位数字后不能有逗号,那么可以这么写:

(?=(\d\d\d)+\b)

表示需要3个数字这样的组合,至少出现1次,最后是单词的分界符。
注意零宽断言,并没有真的匹配,环视的意思可以这么理解,即匹配前先看一看,看前/后是否满足条件,然后再决定当前位置时候合适开始匹配,环视时正则引擎并不传动。
我们可以进行替换,在 notepad++ 中,可以这样进行替换,如图:
正则表达式——环视(零宽断言)_第1张图片
这里有个问题,比如刚好是3的倍数位数字会出现什么情况,比如对于 9 位长度的:

123456789

我们替换后,出现

,123,456,789

说明不够完备,我们需要考虑逗号的前边是必须要有数字的,这里即“逆序肯定”

(?<=\d)

表示位置左边的字符,需要是一个数字,这样的位置才满足要求。
我们上边的两个条件合起来,即需要共同满足这两个条件的位置:

(?<=\d)(?=(\d\d\d)+\b)

这里多个条件的顺序无所谓,和乘法一样,谁前谁后不影响结果。

你可能感兴趣的:(正则表达式)