正则表达式之环视边界匹配

正则表达式大家都比较熟悉了,基础的语法就不多介绍了。今天主要分享下一种叫做 “环视边界” 的匹配规则,在特定场景下,是一个非常有用的技巧。

环视边界匹配规则

顾名思义,环视边界匹配仍然是一种边界匹配。而环视的字面意思就是左右看看,需要左右符合一些条件,本质上,它也是匹配边界,对边界有一些要求,这个要求是针对左边或右边的字符串的。

根据要求不同,分为 4 种环视:

  1. 肯定顺序环视,语法是 (? =...),要求右边的字符串匹配指定的表达式。比如表达式 abc (? =def), (? =def) 在字符 c 右面,即匹配 c 右面的边界。对这个边界的要求是:它的右边有 def,比如 abcdef,如果没有,比如 abcd,则不匹配。
  2. 否定顺序环视,语法是 (? ! ...),要求右边的字符串不能匹配指定的表达式。比如表达式 s (? ! ing),匹配一般的 s,但不匹配后面有 ing 的 s。注意:避免与排除型字符组混淆,比如 s[^ing],s[^ing] 匹配的是两个字符,第一个是 s,第二个是 i、n、g 以外的任意一个字符。
  3. 肯定逆序环视,语法是 (? <=...),要求左边的字符串匹配指定的表达式。比如表达式 (? <=\s) abc, (? <=\s) 在字符 a 左边,即匹配 a 左边的边界。对这个边界的要求是:它的左边必须是空白字符。
  4. 否定逆序环视,语法是 (? <! ...),要求左边的字符串不能匹配指定的表达式。比如表达式 (? <! \w) cat, (? <! \w) 在字符 c 左边,即匹配 c 左边的边界。对这个边界的要求是:它的左边不能是单词字符。

案例

邮编

国内的邮编为 6 位数字,那么最简单的规则就是

[0-9]{6}

这个规则可用于判断给定的一个字符串是否是邮编,但是这个正则用于查找是不够的,比如输入 1234567,7 个字符,同样也满足这个表达式,但这肯定不是一个邮编。这怎么办呢?可以使用环视边界匹配,对于左边界,它前面的字符不能是数字,环视表达式为:

(?<![0-9])

对于右边界,它右边的字符不能是数字,环视表达式为:

(?![0-9])

那么完整的表达式就是:

(?<![0-9])[0-9]{6}(?![0-9])

其他

邮编是相对比较简单的例子,对于其他复杂的表达式,我们都可以按照这个方法,在原有的表达式基础上,加上环视边界规则,这样,我们的正则表达式不仅可以用于判断,也可以用于查找。