我正在用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
答案 0 :(得分: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)[:. ]+)
之后使用所有格修饰符,以更快地匹配无效字符串并使其失效。
答案 1 :(得分:0)
我会保持简单,只使用:
^(?i)(?!.*\b(deputy clerk|electronic recording)\b).*$
此模式断言,deputy clerk
和electronic recording
短语不在行中的任何地方。