Регулярное выражение для сопоставления со словом, но только если оно не предшествует или не следует другое конкретное слово - PullRequest
0 голосов
/ 20 сентября 2018

Требуется строка Regex для работы с настраиваемым типом Exchange DLP «Чувствительная информация».

то есть совпадение на Смите, но не в том случае, если Джон Смит или Смит Джон

(?i)(?<!John\s)Smith работают«Джон Смит», хотя я не уверен, что он эффективен на 100%.

(?i)(Smith.*\s(?!John)), кажется, работает на «Смит Джон», но не в том случае, если за ним следует пробел или новая строка.

Попробовал следующее, чтобы объединить их в одну строку, но, похоже, это не сработало.

(?i)(?<!John\s)Smith |(?i)(Smith.*\s(?!John))

(?i)(?<!John\s)Smith.*\s(?!John)

Что я за ошибка школьникачто делает?

1 Ответ

0 голосов
/ 20 сентября 2018

Шаблон (?i)(?<!John\s)Smith |(?i)(Smith.*\s(?!John)) соответствует Smith, у которого нет John + 1 пробела перед ним, ИЛИ Smith, за которым следует любое количество символов с последующим пробелом, которыйне сразу сопровождается John.Таким образом, он соответствует Smith во многих позициях.

Шаблон (?i)(?<!John\s)Smith.*\s(?!John) захватывает Smith, которому непосредственно не предшествует John + пробел, и весь текстдо последнего пробела, за которым сразу не следует John.

Убедитесь, что шаблон \s находится в пределах взгляда:

(?i)(?<!John\s)Smith(?!\s+John)

См. демонстрационную версию regex

Подробности

  • (?i) - встроенный модификатор без учета регистра
  • (?<!John\s) - местоположение, которому непосредственно не предшествуетHohn и символ пробела
  • Smith - литеральная подстрока
  • (?!\s+John) - за подстрокой Smith не следует сразу же ставить пробел 1+ (или, если вы используете \s*, с пробелами 0+) и подстрокой John.
...