Почему мой Regex возвращает мне ОДНУ группу? - PullRequest
0 голосов
/ 30 апреля 2020

У меня сейчас проблемы с регулярным выражением, которое я создаю. Регулярное выражение должно извлечь все группы, в которых указано число #### между Hello и Regards. В данный момент мое регулярное выражение извлекает только одну группу, и мне нужны все группы внутри, в данном случае у меня есть 2, но внутри может быть больше.

Изображение регулярного выражения

Я использую веб-страницу https://regex101.com/

Аромат : PCRE (PHP)

Regex : Hello\s.*(number\s*[\d]*)\s.*Regards

Текст :

This is my test text number 25120
Hello my name is testing
I'm 20 years old
Please help me with the regex number 1542
I have been trying to create the regex many times this is my number 5152
Regards
I'm still trying my attempt number 5150

Результат :

Мой результат только номер группы 5152, но внутри другой номер группы 1542.

1 Ответ

0 голосов
/ 30 апреля 2020

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

(?si)(?:\G(?!\A)|\bHello\b)(?:(?!\bHello\b).)*?\K\bnumber\s*\d+(?=.*?\bRegards\b)

См. Демоверсию regex .

Подробности

  • (?si) - s - модификатор DOTALL заставляет . соответствовать любым символам, а i делает регистр нечувствительным к регистру
  • (?:\G(?!\A)|\bHello\b) - либо конец предыдущего соответствия (\G(?!\A)), либо (|) целое слово Hello (\bHello\b)
  • (?:(?!\bHello\b).)*? - любой символ, 0 или более раз, но как можно меньше, который не начинается целое слово Hello последовательность символов
  • \K - оператор сброса совпадений, который отбрасывает весь сопоставленный текст
  • \bnumber - целое слово number
  • \s* - 0+ пробелов
  • \d+ - 1+ цифр
  • (?=.*?\bRegards\b) - где-то после любых 0+ символов (как можно меньше) должно быть целое слово Regards.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...