正则表达式 - 使用否定环视匹配同句中的单词

Posted

技术标签:

【中文标题】正则表达式 - 使用否定环视匹配同句中的单词【英文标题】:RegEx - Match Words in Same Sentence with Negative Lookaround 【发布时间】:2021-09-16 19:05:57 【问题描述】:

如果同一个句子中不存在另一个词(坏),我正在尝试匹配一个词(好)。我想使用lookaround 来执行此操作,因为我只想将第一个单词(好)包含在捕获的结果中。

这是我的正则表达式:

(?<!\bbad\b[^.])\bgood\b(?![^.]+\bbad\b)

这在所有情况下都有效,除非我正在寻找的词(好)在另一个词(坏)之前。

所以在下面的例子中,结果如下:

    测试 1:错误正则表达式的一个很好的例子。 (无匹配 - PASS) 测试 2:一个好的正则表达式的坏例子。 (找到匹配 - 失败) 测试 3:一个不好的例子。一个好的正则表达式。 (找到匹配项 - PASS) 测试 4:一个很好的例子。一个糟糕的正则表达式。 (找到匹配项 - PASS)

有人可以指出我在这里缺少什么吗? Here's my test on regex101.com.

【问题讨论】:

所以bad不能在同一句话中出现在good之后? @anubhava。是的,在同一个句子中,“坏”不能出现在“好”之前或之后。如果“好”之后出现“坏”,我的正则表达式有效。但是,如果在同一个句子中“好”之前出现“坏”,则正则表达式会失败。 顺便提一下,matching what you don't need but capture what you want 也可以:[^.]*\bbad\b[^.]*|(\bgood\b) (如果你可以使用这个,取决于你的任务。它需要以编程方式检查,如果设置了组 1)跨度> 【参考方案1】:

你可以使用这个正则表达式:

(?:^|\.)(?:(?!\b(?:bad|good)\b)[^.])*(\bgood\b)(?![^.]+\bbad\b)

RegEx Demo

正则表达式详细信息:

(?:^|\.):匹配起始位置或点 (?:(?!\b(?:bad|good)\b)[^.])*:如果前面没有单词goodbad,则匹配非点字符。重复此匹配 0 次或多次 (\bgood\b):匹配全字good (?![^.]+\bbad\b):否定前瞻断言我们没有一个或多个非点字符后跟单词,bad 在当前位置之前

【讨论】:

这里是所有Unit Tests【参考方案2】:

如果支持后向中的量词,您可以选择重复字符类,排除匹配换行符。

(?<!\bbad\b[^.\n]*)\bgood\b(?![^.\n]+\bbad\b)

模式匹配:

(?&lt;!\bbad\b[^.\n]*) 否定后视,向左断言不是单词 bad 后跟可选字符,不包括 . 或换行符 \bgood\b匹配单词good (?![^.\n]+\bbad\b) 负前瞻,右边断言不是可选字符,不包括. 或换行符和单词bad

Regex demo

【讨论】:

这是现代 javascript 等风格的好正则表达式 这是一个非常干净的表达。我在 C# .NET Core 中使用它,并且在后向中支持量词。所以我会使用你的解决方案。谢谢!

以上是关于正则表达式 - 使用否定环视匹配同句中的单词的主要内容,如果未能解决你的问题,请参考以下文章

巧解正则表达式环视

正则表达式的环视和匹配

正则表达式环视

正则之环视

正则表达式的环视

正则基础之 环视