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

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

这是我的正则表达式:

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

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

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

  1. 测试 1:错误正则表达式的一个很好的例子。 (无匹配 - PASS)
  2. 测试 2:一个好的正则表达式的坏例子。 (找到匹配 - 失败)
  3. 测试 3:一个不好的例子。一个好的正则表达式。 (找到匹配项 - PASS)
  4. 测试 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)跨度>

标签: regex regex-lookarounds sentence


【解决方案1】:

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

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

RegEx Demo

正则表达式详细信息:

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

【讨论】:

【解决方案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 中使用它,并且在后向中支持量词。所以我会使用你的解决方案。谢谢!
猜你喜欢
  • 2010-12-29
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2013-06-10
  • 2014-12-24
  • 2020-08-03
相关资源
最近更新 更多