Как использовать регулярное выражение, чтобы отменить сопоставление строки, если в этой строке существует определенное слово?

#regex-lookarounds #regex-negation

#регулярное выражение-поиск #регулярное выражение-отрицание

Вопрос:

У меня есть следующее регулярное выражение

 (?!.*internal).*auditor['’s]*.*(?=report)|(?!.*internal)(?<=report).*auditor['’s]*.*
  

и следующие тестовые примеры

 report of auditor
report of external auditor
auditor external report
in auditor report
auditor report
internal report of auditor
report of internal auditor
auditor internal report
  

Я хочу сопоставить, есть ли оно report до или после auditor['’s]* , но я не хочу сопоставлять, если слово internal представляет

будет сопоставлено с моим приведенным выше регулярным выражением internal report of auditor .

Вот желаемый результат

 report of auditor
report of external auditor
auditor external report
in auditor report
auditor report
  

Вот регулярное выражение 101

Комментарии:

1. Что значит, вы не хотите сопоставлять строку. В них есть три строки с «internal».

2. Кроме того, не просто «отчет» перед или после «auditior», а скорее «отчет» после «auditor’s», или «отчет» перед «auditor» (без «s»)?

3. @ Bohemian ♦, 1. Я не хочу сопоставлять эти три строки; 2. это до или после auditor с или без 's

4. Хорошо, значит, 's не имеет значения.

Ответ №1:

"'s" Суффикс к "auditor" кажется неуместным, поэтому удалите это ненужное усложнение.

Ваше требование может быть выражено как:

  • содержит "auditor"
  • содержит "report" (потому что «до или после чего-то» просто означает «содержит» — «что-то» не имеет значения)
  • не содержит "internal"

Вводим это в регулярное выражение:

 ^(?!.*binternalb)(?=.*breportb).*bauditorb.*
  

Я установил границы слов ( b ) вокруг терминов, так что, например, «интернализация» и «отчетность» не совпадают.

Смотрите живую демонстрацию, показывающую, что это соответствует всем, кроме последних 3 строк вашего образца ввода.