如何在正则表达式中创建动态捕获组?

Sha*_*deh 6 php regex string

我有一个像这样的字符串:

$str ="
- group1
- group2
- group3
";
Run Code Online (Sandbox Code Playgroud)

我也有这个正则表达式:

/(\-\s\w+)\n(\-\s\w+)\n(\-\s\w+)/
Run Code Online (Sandbox Code Playgroud)

如你所知,还有为三个捕获组:$1,$2$3.我手动制作了这些组.我的意思是如果我将其附加到上面的字符串:

- group4 
- group5
Run Code Online (Sandbox Code Playgroud)

那个正则表达式与它们不匹配.


好吧,我有一个恒定的模式:(\-\s\w+),我想在字符串中的匹配项数量上创建一个单独的捕获组.野兔就是一些例子:

例1:

$str="
- group 1
";
Run Code Online (Sandbox Code Playgroud)

我需要一个正则表达式给我所有的字符串$1.


例2:

$str="
- group 1
- group 2
";
Run Code Online (Sandbox Code Playgroud)

我需要一个正则表达式给我第一行string(- group 1)$1和第二行(- group 2)$2


好吧,正如你在上面的例子中看到的那样,字符串是动态的,但它是按照一个常量模式...现在我想知道如何根据字符串创建一个动态捕获组?

fus*_*n3k 4

无法捕获重复基团是一个众所周知的限制

如果您知道最大重复模式,您可以将正则表达式设置为(即 max=5):

/(\-\s\w+)\n(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?/
Run Code Online (Sandbox Code Playgroud)

您将在第 1 到 5 组中找到 1 到 5 个匹配项。
实际上,您必须重复(\-\s\w+)?\n?尽可能多的重复模式。

否则,如果您的最大可能数量未定义,我不知道除了构造动态模式之外还有其他方法,如下所示:

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

上面的模式可行,但我不知道您的确切替换条件,因此它可能无法用于您的目的。