Regex несколько групп захвата на одном шаблоне

Допустим, у меня есть строка:

12345678

У меня также есть следующие шаблоны:

/^.*$/
/^[0-9]+$/

Оба этих шаблона соответствуют строке. Я хочу выяснить, что оба шаблона соответствуют строке. Я могу пройтись по каждой схеме и добавить preg_match но это слишком медленно

Я хочу быть в состоянии сделать что-то вроде этого:

preg_match_all('/^(?P<pattern1>.*)|(?P<pattern2>[0-9]+)$/', $string, $matches);

Это, однако, даст мне что-то вроде:

[
'pattern1' => '12345678',
'pattern2' => ''
]

Как вы можете видеть, pattern2 появляется пустым, потому что pattern 1 уже захватил строку.

Как бы я написал свой preg_match_all регулярное выражение, чтобы и pattern1, и pattern2 (и любые другие шаблоны) имели шанс сопоставить одну и ту же строку? Однако я не придерживаюсь правила регулярного выражения, которое будет возвращать все шаблоны, если только все шаблоны совпадают. Я хочу, чтобы он возвращал все шаблоны, которые совпадают, и все шаблоны, которые не совпадают.

редактировать

Просто чтобы уточнить,

Шаблоны, которые я привел в качестве примеров, являются лишь примерами.

В моем реальном сценарии будет неизвестное количество шаблонов, которые соответствуют неизвестным строкам.

Причина, по которой цикл через foreach слишком медленный, заключается в том, что я буду циклически проходить через десятки шаблонов с тысячами строк. Я могу ускорить эту часть кода на количество шаблонов, если их можно эффективно объединить в одно правило на строку.

1

Решение

Вы можете использовать следующий трюк:

^(?P<pattern1>(?P<pattern2>^[0-9]+$)|.*)$

Поскольку pattern2 находится внутри pattern1 и отделен |.. каждый символ проверяется на совпадения ..

Увидеть DEMO

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]