Как захватить рекурсивные группы в регулярном выражении? - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь захватить шаблон, который может появляться несколько раз в регулярных выражениях в разных группах. Шаблон, который может появляться несколько раз:

(\b\\d{4}\\s*\\d{4}\\s*\\d{4}\\s*\\d{4}\b\\s*)

Пожалуйста, смотрите полный тест @ здесь !

Ожидаемый результат должен быть:

Full Match:
Group1:1111 1111 1111 1111
Group2:2222 2222 2222 2222
... GroupN...

как этого достичь?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

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

(\d{4}\s)\1\1(\d{4}\s?)

Демонстрация 1

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

(\d{4})(\s+)\1\2\1\2\1

Демонстрация 2

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

0 голосов
/ 06 июня 2019

Использование:

(?:<select\b|\G).*?(\b\d{4}(?:\s*\d{4}){3}\b)(?=.*?</select>)

Демо

Объяснение:

(?:                 # non capture group
  <select\b         # literally
  |                 # OR
  \G                # restart from previous match position
)                   # end group
.*?                 # 0 or more any character, you may use [\s\S]*?
(                   # start group 1
  \b                # word boundary
  \d{4}             # 4 digits
  (?:               # non capture group
    \s*             # 0 or more spaces
    \d{4}           # 4 digits
  ){3}              # end group, may appear 3 times
  \b                # word boundary
)                   # end group 1
(?=                 # lookahead, make sure we have aftre:
  .*?               # 0 or more any character
  </select>         # end tag
)                   # end lookahead

Пример кода (php):

preg_match_all('~(?:<select\b|\G).*?(\b\d{4}(?:\s*\d{4}){3}\b)(?=.*?</select>))~', $html, $matches);
print_r($matches[1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...