我想知道捕获组(或非捕获)如何影响正则表达式中的外观。 这是两个例子:
test (?:(?!<start).)+
test (?!<start).+
如果有人能够解释正则表达式引擎如何详细解释这两种情况,我将不胜感激。
答案 0 :(得分:3)
\b vs. (\b)
。 Edge案例涉及反向引用可选组,但这不是很有趣。 (?=...)
和(?<=...)
- 可以捕获群组。例如,/(?=(\b\w+\b))/
将导致正空匹配,其中每个匹配都有一个非空组。例如,/(?<=(.))\1/
将匹配后跟相同字符的字符。(?!...)
和(?<!...)
- 无法捕获群组。当你想到它时,这很有意义,因为永远不会匹配,但是他们可以在其中使用捕获组。例如,^(?!.*(.).*\1).*$
将匹配不包含重复字母的行。 同样,在这种情况下,\1
行为如何表现出来并不是特别有趣。 现在,举个例子。这两种模式匹配不同的文本:
(?:(?!<start).)+
- 检查我们是否不在文本start
之后,然后匹配所有字符(行)。例子:
"start1234end"
,匹配整个输入 - 开始位置不在“开始”之后。"before123startAfter"
假设前一个匹配是"before123start"
(在允许的不同模式下),下一个匹配无法从此处开始,并且会跳过一个字符:"fter"
。 (?:(?!<start).)+
- 这里,对于每个字符重复使用lookbehind断言(对于直觉:如果组(?:...)+
是循环,则断言是循环内部)。如果字符字符串start
后直接,则不匹配字符:
"start1234end"
- 首次匹配为"start"
。引擎无法匹配下一个'1'
(因为它不是start
之后的字符),因此匹配停止。下一场比赛将是"234end"
。