正则表达式之环视边界匹配
正则表达式大家都比较熟悉了,基础的语法就不多介绍了。今天主要分享下一种叫做 “环视边界” 的匹配规则,在特定场景下,是一个非常有用的技巧。
环视边界匹配规则
顾名思义,环视边界匹配仍然是一种边界匹配。而环视的字面意思就是左右看看,需要左右符合一些条件,本质上,它也是匹配边界,对边界有一些要求,这个要求是针对左边或右边的字符串的。
根据要求不同,分为 4 种环视:
- 肯定顺序环视,语法是 (? =...),要求右边的字符串匹配指定的表达式。比如表达式 abc (? =def), (? =def) 在字符 c 右面,即匹配 c 右面的边界。对这个边界的要求是:它的右边有 def,比如 abcdef,如果没有,比如 abcd,则不匹配。
- 否定顺序环视,语法是 (? ! ...),要求右边的字符串不能匹配指定的表达式。比如表达式 s (? ! ing),匹配一般的 s,但不匹配后面有 ing 的 s。注意:避免与排除型字符组混淆,比如
s[^ing]
,s[^ing]
匹配的是两个字符,第一个是 s,第二个是 i、n、g 以外的任意一个字符。 - 肯定逆序环视,语法是 (? <=...),要求左边的字符串匹配指定的表达式。比如表达式 (? <=\s) abc, (? <=\s) 在字符 a 左边,即匹配 a 左边的边界。对这个边界的要求是:它的左边必须是空白字符。
- 否定逆序环视,语法是 (? <! ...),要求左边的字符串不能匹配指定的表达式。比如表达式 (? <! \w) cat, (? <! \w) 在字符 c 左边,即匹配 c 左边的边界。对这个边界的要求是:它的左边不能是单词字符。
案例
邮编
国内的邮编为 6 位数字,那么最简单的规则就是
[0-9]{6}
这个规则可用于判断给定的一个字符串是否是邮编,但是这个正则用于查找是不够的,比如输入 1234567,7 个字符,同样也满足这个表达式,但这肯定不是一个邮编。这怎么办呢?可以使用环视边界匹配,对于左边界,它前面的字符不能是数字,环视表达式为:
(?<![0-9])
对于右边界,它右边的字符不能是数字,环视表达式为:
(?![0-9])
那么完整的表达式就是:
(?<![0-9])[0-9]{6}(?![0-9])
其他
邮编是相对比较简单的例子,对于其他复杂的表达式,我们都可以按照这个方法,在原有的表达式基础上,加上环视边界规则,这样,我们的正则表达式不仅可以用于判断,也可以用于查找。
相关文章