2024-04-26 11:57:23 发布
网友
我想知道捕获组(或非捕获)如何影响Regex中的lookaround。 这里有两个例子:
test (?:(?!<start).)+ test (?!<start).+
如果有人能详细解释regex引擎是如何解释这两种情况的,我将不胜感激。在
\b vs. (\b)
(?=...)
(?<=...)
/(?=(\b\w+\b))/
/(?<=(.))\1/
(?!...)
(?<!...)
^(?!.*(.).*\1).*$
\1
现在,以你为例。两种模式匹配不同的文本:
(?:(?!<start).)+-检查我们不是在文本start之后,然后匹配(该行的)所有字符。示例:
(?:(?!<start).)+
start
"start1234end"
"before123startAfter"
"before123start"
"fter"
(?:(?!<start).)+-在这里,lookbehind断言对每个字符都重复(对于直觉:如果一个组(?:...)+是一个循环,则断言在循环内)。如果字符直接位于字符串start之后,则该字符将不匹配:
(?:...)+
"start"
'1'
"234end"
\b vs. (\b)
)。边案例涉及到反向引用可选组,但这不是很有趣。(?=...)
和(?<=...)
-可以捕获群。例如,/(?=(\b\w+\b))/
将产生正的空匹配,其中每个匹配都有一个非空组。例如,/(?<=(.))\1/
将匹配跟在相同字符后面的字符。在(?!...)
和(?<!...)
-无法捕获组。当你想到它的时候,这很有意义,因为永远不匹配,但是它们可以在它们内部使用捕捉组。例如,^(?!.*(.).*\1).*$
将匹配不包含重复字母的行。再说一次,\1
如何表现,在这种情况下,不属于群体的特殊性现在,以你为例。两种模式匹配不同的文本:
(?:(?!<start).)+
-检查我们不是在文本start
之后,然后匹配(该行的)所有字符。示例:"start1234end"
,匹配整个输入的开始位置不在单词“start”之后。在"before123startAfter"
假设上一个匹配是"before123start"
(在另一个模式上允许),下一个匹配不能从这里开始,并且将跳过一个字符:"fter"
。在(?:(?!<start).)+
-在这里,lookbehind断言对每个字符都重复(对于直觉:如果一个组(?:...)+
是一个循环,则断言在循环内)。如果字符直接位于字符串start
之后,则该字符将不匹配:"start1234end"
-第一个匹配项将是"start"
。引擎无法匹配下一个'1'
(因为它不是一个不在start
之后的字符),因此匹配停止。下一个匹配项将是"234end"
。在相关问题 更多 >
编程相关推荐