Как соответствовать «иметь», но не «иметь» - PullRequest
1 голос
/ 16 марта 2020

Я бы хотел подобрать фразы, подобные этой:

  • с той же проблемой
  • с той же проблемой
  • с таким же вопросом
  • Я получаю ту же проблему
  • Я вижу ту же проблему
  • У меня та же проблема

Но я не хочу сопоставлять их, если они находятся в прошедшее время, что означает, например, что все, что содержит слово, должно быть исключено:

  • У меня была такая же проблема
  • был такой же вопрос

Позже я добавлю другие слова в прошедшем времени.

Я пробовал это регулярное выражение, но оно по-прежнему соответствует "той же проблеме", даже если ему предшествовало слово "has"

((?:i\s)?(?:have\s)?(?<!had\s)(?:(?:the\s|a\s)?same\s(?:(?:problem|question|issue)|here)))

https://regex101.com/r/Nvjtqj/1

Почему это регулярное выражение все еще находит фразу "та же самая проблема", даже если перед ней стоит слово "имел"?

Ответы [ 2 ]

4 голосов
/ 16 марта 2020

Вам необходимо исключить все совпадения с нужным глаголом в прошедшем времени, а затем сопоставить то, что вам нужно:

(\b(?:i\s+)?(?:have\s+)?)(?:had|faced)\s+((?:the\s+)?same\s+(?:problem|question|issue|here))(*SKIP)(*F)|(?1)(?2)

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

Подробности

  • (\b(?:i\s+)?(?:have\s+)?)(?:had|faced)\s+((?:the\s+)?same\s+(?:problem|question|issue|here))(*SKIP)(*F) - (*SKIP)(*F) заставит механизм регулярных выражений отбрасывать текст, соответствующий следующим шаблонам, и go при поиске совпадения в неудачном месте:
    • (\b(?:i\s+)?(?:have\s+)?) - группа 1:
      • \b - граница слова
      • (?:i\s+)? - необязательная группа, соответствующая i и затем 1+ пробелам
      • (?:have\s+)? - необязательная группа, соответствующая have и затем 1+ пробелам
    • (?:had|faced) - had или faced
    • \s+ - 1+ пробелов
    • ((?:the\s+)?same\s+(?:problem|question|issue|here)) - Группа 2:
      • (?:the\s+)? - необязательная группа, соответствующая the, а затем 1+ пробелов
      • same\s+ - same и 1+ пробелы
      • (?:problem|question|issue|here) - одно из слов в группе
  • | - или совпадение и верните следующее совпадение:
    • (?1) - группа Повторение 1 шаблона
    • (?2) - Повторение шаблона 2 группы
1 голос
/ 16 марта 2020

Когда вы не привязываете свои выражения, механизм регулярных выражений просто выдаст слово, чтобы выражение соответствовало - в данном случае 'the', так как 'same' не имеет проблемы с предшествующим 'had '.

Обратите внимание, что это расширяет границы того, что вы можете и должны делать с одним выражением, и вводите на территорию несколько проверок и парсеров. Если вам нужно сделать это с помощью выражения, это может быть что-то вроде:

^(?!.*\b(?:had)\b)(?=.*same (?:problem|question|issue)).*

, где вы делаете положительное и отрицательное утверждение из одной и той же фиксированной позиции.

...