|
|

楼主 |
发表于 2023-1-15 22:35
|
显示全部楼层
正则非捕获匹配 - 正向先行断言
表达式(?=子表达式)
例:
Windows(?=95)
Windows 是表达式,是我们要查找的核心,也就是我们要匹配的“Windows”,但不是所有的“Windows”都会匹配,它由子表达式 ?=95 决定,子表达式中的 ?= 引出的子表达式是 95,它限制了前面的“Windows”后面必须紧跟着“95”才能匹配,“Windows98”和“Windows7”中的“Windows”都不匹配。需要注意的是,通过匹配得到结果的仅仅是“Windows”,不包含子表达式中的 95,因此断言又称为“零宽断言”,子表达式在匹配过程中只起限制作用,不占存储字符,术语称之为不消耗。
总得来讲,正向先行断言是要去匹配一个主表达式,该表达式后面跟着一个子表达式,子表达式用于限制主表达式的匹配条件,子表达式由 ?= 做引导,子表达式只做限制匹配条件,不参与将来的匹配结果的引用,如果匹配成立那么整个正则表达式匹配出的结果就是主表达式自身。
主表达式和子表达式可以是字面词,也可以是各种规则的正则表达式。
先说主表达式。Windows95 也可以写成为 Windows 95,Windows 和 95 之间可以有一个空格,那么,我们想两种表示法都匹配,就改造主表达式的构造:
Windows\s?
其中,\s 是空格,? 是正则量词,表示0或1次。合起来,主表达式的意思就是 Windows后面或者有一个空格或者没有。这样处理后,Windows95 和 Windows 95 中的 Windows 都会被匹配到。
接着改造子表达式。我们希望能同时匹配 Windows95/98/XP/7,子表达式可以这么写,(?=95|98|XP|7),其中,符号 | 表示或者的意思。连同改写过的主表达式,正则式子是这样:
Windows\s?(?=95|98|XP|7)
这个表达式就能匹配主表达式和子表达式共同营造的条件,演示框中对应项的 Windows 都会被标红。
还可以针对主、子表达式做更复杂的操作,这里就点到为止了。
|
|