Как создать динамическую группу захвата в regex?

у меня есть строка, как это:

$str ="
- group1
- group2
- group3
";

также у меня есть это выражение:

/(-sw+)n(-sw+)n(-sw+)/

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

- group4 
- group5

тогда это регулярное выражение не соответствует им.


Ну, у меня постоянная закономерность:(-sw+), и я хочу создать отдельную группу захвата по количеству элементы в строке. Заяц приводит несколько примеров:

Пример 1:

$str="
- group 1
";

мне нужно регулярное выражение, чтобы дать мне всю строку .


Пример 2:

$str="
- group 1
- group 2
";

мне нужно регулярное выражение, чтобы дать мне первую строчку строку (- group 1) by и второй линии (- group 2) by


хорошо, как вы видите в приведенных выше примерах, строка динамична, но она соответствует постоянная закономерность ... Теперь я хочу знать, как я могу создать динамическую группу захвата в соответствии со строкой?

2 ответов


невозможность захвата повторяющихся групп-это хорошо известное ограничение.

Если вы знаете максимальный повторяющийся шаблон, вы можете установить регулярное выражение как (т. е. max=5):

/(\-\s\w+)\n(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?/

и вы найдете от одного до пяти матчей в группах от 1 до 5.
По существу, вы должны повторить (\-\s\w+)?\n? для максимального возможного количества повторяющихся элементов.

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

$regex = '(\-\s\w+)\n';
$regex = '/'.( str_repeat( $regex, preg_match_all( "/$regex/", $str, $matches ) ) ).'/';

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


используя M-модификатор (многострочный): это позволит совпадению на каждой строке.

попробуйте использовать ниже regex:

 preg_match_all('/(\-\s\w+)/m', $str, $matches);
 print_r($matches);