|
|

楼主 |
发表于 2023-1-16 12:01
|
显示全部楼层
负向先行断言
表达式(?!子表达式)
例:
Windows(?!95)
Windows 是被匹配的表达式。圆括号是否定性质的先行断言,用以限制前面的表达式,其中:?! 表示不能等于,95 是字面量,不能等于的值。整个正则表达式的意思是,如果有这么一个带检索字符串,Windows 后面不等于 95 ,则这个字符串的 Windows 匹配这个正则表达式。
负向先行断言又称否定先行断言,和正向先行断言(又称肯定先行断言)不同,子表达式的引导符号是 ?!,等号 = 变成了感叹号 ! 。在编程世界,= 表示等于即肯定,! 表示否定,JS里不等于就写成 != ,但这里是正则的负向先行断言,?! 是引导词,表示不能等于其后面的值(例如 95)。
负向先行断言的子表达式是以否定的形式来匹配(或曰限制)其前面的主表达式,Windows(?!95) 这个正则表达式表示,我要去匹配 Windows 后面不是紧跟着 95 的 Windows,如此,我们的演示框里,除了 Windows95 这一行,其余的都匹配,都会标红。
负向先行断言中的子表达式有否定意味,JS之前对其是不支持的,现在主流浏览器已经支持,但估计仍有问题。我的经验是,使用否定式先行断言,主表达式不要弄成复杂的,最好就是一个字面量表达式,子表达式则可以设置为稍微复杂一点的。试看下面的式子:
Windows(?!\s?2000)
这个式子,子表达式 (?!\s?2000) 里,?! 是引导词,不能等于。\s? 是或没有或有一个的空格,后面是 2000 ,\s?2000 是一个组合单位,(?!\s?2000) 整体就是先行断言子表达式,用以限制前面的主表达式,意为:Windows 后面如果不是紧跟着带空格或不带空格的 2000 的,就匹配。
下面是在上面式子基础上做了一些改动:
Windows(?!\s?(2000|98))
这里,子表达式有了嵌套,\s? 是一个单元,表示可有可无的空格,(2000|98)是另一个单元,2000 或 98,整个子表达式 (?!\s?(2000|98)) 的意思就是,不许主表达式 Windows 去匹配带空格或不带空格的 2000 或 98,大家可以去演示楼试一下。
|
|