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


How do I create a dynamic capturing group in regex?

我有一个这样的字符串:

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

我也有这个正则表达式:

/('-'s'w+)'n('-'s'w+)'n('-'s'w+)/

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

- group4 
- group5

然后该正则表达式与它们不匹配。


好吧,我有一个恒定的模式:('-'s'w+),并且我想在字符串中的匹配项数量上创建一个单独的捕获组。Hare是几个例子:

示例 1:

$str="
- group 1
";

我需要一个正则表达式来通过$1给我所有的字符串。


示例 2:

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

我需要一个正则表达式来给我第一行字符串 ( - group 1 ) 按$1和第二行 ( - group 2 ) 按$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 修饰符(多行):这将让每行匹配。

尝试使用以下正则表达式:

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