Java否定前瞻以排除单词

我正在用Java编写一个正则表达式来匹配名称,但想排除包含某些单词的行的匹配:“副书记”或“电子录音”(不区分大小写)。

这是我的正则表达式:

(?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

liaoyi1107 回答:Java否定前瞻以排除单词

您尝试失败的单词被捕获到第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)[:. ]+)之后使用所有格修饰符,以更快地匹配无效字符串并使其失效。

,

我会保持简单,只使用:

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

Demo

此模式断言,deputy clerkelectronic recording短语不在行中的任何地方。

本文链接:https://www.f2er.com/3168275.html

大家都在问