【问题标题】:Java negative lookahead to exclude wordsJava否定前瞻排除单词
【发布时间】:2019-11-04 16:43:42
【问题描述】:

我正在用 Java 编写一个正则表达式来匹配名称,但想要排除包含某些单词的行的匹配项:“Deputy Clerk”或“Electronic Recording”(不区分大小写)。

这是我的正则表达式:

(?i)(?:(?:Hon(?:orable)?|Judge)[:. ]+)+(?-i)([A-Z][A-Za-z. '-]{5,}(?i)(?:,? +[JS]R +\.)?)(?!Deputy Clerk|Electronic Recording)

我打算让它只匹配以下 3 行中的第一行,但它目前正在返回所有 3 行的匹配项。

Hon. Judge: Amy D. Hogue
HONORABLE    Lesley Briones Jr.     JUDGE          DEPUTY CLERK
HONORABLE      JUDGE PRO TEM       ELECTRONIC RECORDING MONITOR

我的负前瞻有什么问题? https://regexr.com/4o3sr

【问题讨论】:

  • 哪些词被列入黑名单(即禁词列表是什么)?
  • @TimBiegeleisen “副文员”和“电子录音”。我已经编辑了我的帖子。
  • 请在您尝试创建的正则表达式后面添加语言。
  • regex101.com/r/7JedgH/1 您尝试失败的单词被捕获到第1组。如果左侧上下文右侧有任何被禁止的单词,您需要全部失败,或者调和第 1 组模式。
  • @WiktorStribiżew 谢谢,您的正则表达式正是我所需要的。你能解释一下——也许是在一个答案中——你所说的“缓和第 1 组模式”是什么意思?

标签: java regex


【解决方案1】:

您尝试失败的单词被捕获到第 1 组,它的模式会抓取包含这些单词的文本,并且由于没有明确的边界,也没有组模式回火,所以前瞻返回 true,因为它没有找到被禁止的短语在当前索引的字符串位置。

你可以使用

(?i)(?:(?:Hon(?:orable)?|Judge)[:. ]+)++(?!.*(?:Deputy Clerk|Electronic Recording))((?-i:[A-Z])[A-Za-z. '-]{5,}(?:,? +[JS]R +\.)?)

regex demo

如果被禁止的词句是整个单词,则只失败,添加单词边界:

(?i)(?:(?:Hon(?:orable)?|Judge)[:. ]+)++(?!.*\b(?:Deputy Clerk|Electronic Recording)\b)((?-i:[A-Z])[A-Za-z. '-]{5,}(?:,? +[JS]R +\.)?)

请注意,如果您使用修饰符组,您可能会去掉第二个 (?i)(?-i:[A-Z])

一旦将(?!.*\b(?:Deputy Clerk|Electronic Recording)\b) 放在(?:(?:Hon(?:orable)?|Judge)[:. ]+)++ 之后,如果右侧的任何地方在非捕获组中有一个替代项,则匹配失败。

另外,我建议在 (?:(?:Hon(?:orable)?|Judge)[:. ]+) 之后使用所有格量词来更快地匹配和失败无效字符串。

【讨论】:

    【解决方案2】:

    我会保持简单,只使用:

    ^(?i)(?!.*\b(deputy clerk|electronic recording)\b).*$
    

    Demo

    此模式断言短语deputy clerkelectronic recording 不会出现在行中的任何位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      相关资源
      最近更新 更多