正则表达式 - 使用否定环视匹配同句中的单词
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)[^.])*
:如果前面没有单词good
或bad
,则匹配非点字符。重复此匹配 0 次或多次
(\bgood\b)
:匹配全字good
(?![^.]+\bbad\b)
:否定前瞻断言我们没有一个或多个非点字符后跟单词,bad
在当前位置之前
【讨论】:
这里是所有Unit Tests【参考方案2】:如果支持后向中的量词,您可以选择重复字符类,排除匹配换行符。
(?<!\bbad\b[^.\n]*)\bgood\b(?![^.\n]+\bbad\b)
模式匹配:
(?<!\bbad\b[^.\n]*)
否定后视,向左断言不是单词 bad
后跟可选字符,不包括 .
或换行符
\bgood\b
匹配单词good
(?![^.\n]+\bbad\b)
负前瞻,右边断言不是可选字符,不包括.
或换行符和单词bad
Regex demo
【讨论】:
这是现代 javascript 等风格的好正则表达式 这是一个非常干净的表达。我在 C# .NET Core 中使用它,并且在后向中支持量词。所以我会使用你的解决方案。谢谢!以上是关于正则表达式 - 使用否定环视匹配同句中的单词的主要内容,如果未能解决你的问题,请参考以下文章