регулярное выражение, заканчивающееся подгруппой - PullRequest
1 голос
/ 24 февраля 2020

У меня могут быть следующие строки: Случай 1:

VIR RECU 998721687978
DE: Mrs PAUL SMITH
564
MOTIF: ANY REASON

или случай 2:

VIR RECU 998721687978
DE: Mrs PAUL SMITH
564

Часть «MOTIF: ...» может отсутствовать в строке

Я ищу регулярное выражение для выделения подстроки из 2 прецедентов. Пока у меня есть: ^VIR\sRECU\s(\d+)\nDE:\s(.*)(\nMOTIF:\s(.*)), что хорошо работает для случая 1, но не для случая 2. Если после группы захвата «мотив», такой как ^VIR\sRECU\s(\d+)\nDE:\s(.*)(\nMOTIF:\s(.*))?, у меня был вопросительный знак, то эта группа никогда не изолируется

Полагаю, проблема в группе (. *), Но не могу понять, как ее исправить.

Возможно ли это? Или я должен иметь 2 разных регулярных выражения, по 1 для каждого случая?

Я использую эти регулярные выражения в php с функцией preg_math ().

Я хочу получить следующие результаты: 998721687978, Mrs PAUL SMITH 564 и ANY REASON значения

1 Ответ

1 голос
/ 25 февраля 2020

Вы можете использовать

^VIR\s+RECU\s+(\d+)\nDE:\s+([\s\S]*?)(\nMOTIF:\s+(.*))?$

См. тест регулярных выражений # 1 и тест регулярных выражений # 2

Подробнее о регулярных выражениях

  • ^ - начало строки
  • VIR\s+RECU\s+ - VIR, 1+ пробелов, RECU и снова 1+ пробелов
  • (\d+) - группа 1: одна или несколько цифр
  • \nDE: - новая строка и DE: подстрока
  • \s+ - 1+ пробелов
  • ([\s\S]*?) - Группа 2: любые 0+ символов, как можно меньше
  • (\nMOTIF:\s+(.*))? - дополнительная группа захвата # 3:
    • \nMOTIF: - перевод строки и MOTIF: строка
    • \s+ - 1+ пробелов
    • (.*) - Группа 4: любые 0+ символов, кроме символов разрыва строки, максимально возможное количество
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...