Regex 如果满足否定前瞻,则取消匹配完整单词

Regex 如果满足否定前瞻,则取消匹配完整单词,regex,regex-lookarounds,Regex,Regex Lookarounds,我只需要匹配那些没有特殊字符的单词,比如@和:。 例如: git@github.com不应该匹配 列表应返回有效的匹配项 show还应返回有效的匹配项 我尝试使用负前瞻\w+?![@:] 但它和gi完全匹配git@github.com但它也不应该与此匹配。您可以将\w添加到前瞻: \w+(?![\w@:]) 等价物是使用单词边界: \w+\b(?![@:]) (?<!\S)\w+(?!\S) 此外,您可以考虑添加左侧边界,以避免在非单词非空白区域的文本块中匹配单词: ^\w+(?![

我只需要匹配那些没有特殊字符的单词,比如@和:。 例如:

git@github.com不应该匹配 列表应返回有效的匹配项 show还应返回有效的匹配项 我尝试使用负前瞻\w+?![@:]

但它和gi完全匹配git@github.com但它也不应该与此匹配。

您可以将\w添加到前瞻:

\w+(?![\w@:])
等价物是使用单词边界:

\w+\b(?![@:])
(?<!\S)\w+(?!\S)

此外,您可以考虑添加左侧边界,以避免在非单词非空白区域的文本块中匹配单词:

^\w+(?![\w@:])

^将匹配字符串开头的单词,和?仅当单词前面有空格或字符串开头时才匹配


为什么不呢?因为既然你正在构建一个lexer,你很可能必须处理自然语言的句子,在这些句子中,单词后面可能会有标点符号,还有\只有在后跟空格或字符串末尾时,S的负向前看才能使\w+匹配。

您可以在单词模式周围使用负向后看和负向前看模式,以确保单词的前面或后面没有非空格字符,或者换句话说,要确保它被空格或字符串边界包围,请执行以下操作:

\w+\b(?![@:])
(?<!\S)\w+(?!\S)

演示:

您需要添加边界,如果您的字符串是完整的行,则需要添加锚点,或者添加一个\w内部前瞻如何工作?我不明白。@AMANSHARMA如果右边有一个单词char,匹配就会失败,因此它充当了一个明确的单词边界。您可以使用原始的lookahead,但之后需要一个所有格+,而不是常规的+。请看。根据您的第一个逻辑,当它立即找到右边的字符时,它应该失败。它如何仍然匹配列表或显示?它在l或s的右边有字符。@AMANSHARMA\w+匹配一个或多个单词字符,这就是为什么。@AMANSHARMA?匹配字符串的开头或字符串中紧跟空白的位置。然后,\w+获取一个或多个单词字符。然后,它尝试前瞻模式?![\w@:]确保下一个字符不是单词,不是@和非:字符。因此,当存在git@match时,正则表达式引擎将失败,并从匹配中放弃对git的回溯,因为它后面跟着@。然而,由于在gi之后没有一个词是char,所以整个匹配都失败了。这些话介于命令之间。因此,我不能使用锚定标记。