————————————————
(?=pattern):正向先行断言,表示匹配位置后面必须紧跟着满足 pattern 的字符串,但不包括这个字符串在匹配结果中。
(?!pattern):负向先行断言,表示匹配位置后面不能紧跟着满足 pattern 的字符串,也不包括这个字符串在匹配结果中。
(?<=pattern):正向后行断言,表示匹配位置前面必须是满足 pattern 的字符串,但不包括这个字符串在匹配结果中。
(?<!pattern):负向后行断言,表示匹配位置前面不能是满足 pattern 的字符串,也不包括这个字符串在匹配结果中。
(?:pattern):非捕获型分组,表示将 pattern 包含在一个分组中,但不把这个分组的匹配结果保存到分组编号中。这个分组通常用于表示可选的或重复的子表达式,或者是限制量词的作用范围,而不需要把它们的匹配结果单独提取出来。
————————————————
正则表达式的几种断言理解起来看着简单而且有点枯燥,在线用工具测试时不像程序那样提示错误在哪里,自己盲目测试会浪费大量时间。
简单场景(单词内字母):
^(?=a$) --- ba 匹配---目标后面跟着的等于这个
^(?<=a)b$ --- ab 匹配---目标前面以这个开头
^b(?!a)$ --- bb 匹配---目标后面跟着的不是这个 --反选
^b(?<!a)$ --- bb 匹配---目标后面跟着的不是这个
实际应用(行内关键字):
^(.*)(?=linkUp$) 匹配---后面以linkUp结尾的行 (匹配后结果再exclue “linkUp”)
(?<=linkUp)(.*)[^\n]$ 匹配---前面以这个开头的行 (匹配后结果再exclue “linkUp”)
^(?!linkUp)(.*)$ 匹配---前面不以linkUp开头的行 --反选
^(.*)(?<!linkUp)$ 匹配---后面不以linkUp结尾的行
测试零宽断言时不要太依赖免费的正则工具或网站,有些js不支持负向断言,多换几个试试