这种正负前瞻的组合有什么作用?
What does this combination of positive and negative lookahead do?
最近我偶然发现了这个奇怪的 REGEX,它结合了积极和消极的前瞻性,我无法理解它到底做了什么。请记住,这是一些 Java 正则表达式语法。
(?=((?!\bword1\b|\bword2\b).)+?\s*?)
^^ ^^
这两个嵌套前瞻有什么作用?这可以简化吗?
.
如果在“word1”或“word2”中不是“w”则匹配(可以简化\bword1\b|\bword2\b
→\bword[12]\b
),在non-words之间。这就是否定断言的意思,
+?
表示至少一个这样的.
,
- 但实际上只有一个,因为量词是non-greedy,后面跟着总是匹配的
\s*
。因此+?
可以去掉,
\s*?
在这个断言中是没有意义的,因为它总是匹配,并且不消耗任何输入,并且后面没有任何东西,
- 这里的肯定lookahead断言
(?=...)
表示该位置后跟任何字符(除了上面描述的“w”“word”等)。
进一步的简化将删除组捕获,这在上下文中可能是必需的。
所以,简化的正则表达式是 (?=((?!\bword[12]\b).))
。它会在输入的任何字符之前成功,除了 non-words 之间的“word1”或“word2”的开头。匹配项将为空,但第一个捕获组将包含以下字符。
最近我偶然发现了这个奇怪的 REGEX,它结合了积极和消极的前瞻性,我无法理解它到底做了什么。请记住,这是一些 Java 正则表达式语法。
(?=((?!\bword1\b|\bword2\b).)+?\s*?)
^^ ^^
这两个嵌套前瞻有什么作用?这可以简化吗?
.
如果在“word1”或“word2”中不是“w”则匹配(可以简化\bword1\b|\bword2\b
→\bword[12]\b
),在non-words之间。这就是否定断言的意思,+?
表示至少一个这样的.
,- 但实际上只有一个,因为量词是non-greedy,后面跟着总是匹配的
\s*
。因此+?
可以去掉, \s*?
在这个断言中是没有意义的,因为它总是匹配,并且不消耗任何输入,并且后面没有任何东西,- 这里的肯定lookahead断言
(?=...)
表示该位置后跟任何字符(除了上面描述的“w”“word”等)。
进一步的简化将删除组捕获,这在上下文中可能是必需的。
所以,简化的正则表达式是 (?=((?!\bword[12]\b).))
。它会在输入的任何字符之前成功,除了 non-words 之间的“word1”或“word2”的开头。匹配项将为空,但第一个捕获组将包含以下字符。