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

8

我有一个字符串:

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

此外,我有这个正则表达式

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

如您所知,有三个捕获组:$1$2$3。我手动创建了这些组。也就是说,如果我将以下内容附加到上面的字符串中:

- group4 
- group5

那么这个正则表达式就无法匹配它们。


好的,我有一个常量模式:(\-\s\w+),我想在字符串中创建一个分离的捕获组来捕获匹配项的数量。以下是一些示例:

示例1:

$str="
- group 1
";

我需要一个正则表达式来获取所有由$1表示的字符串。

例子2:

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

我需要一个正则表达式,通过$1给出字符串的第一行(- group 1),并通过$2给出第二行(- group 2)。


好的,正如您在上面的示例中所看到的,字符串是动态的,但它遵循一个恒定的模式...现在我想知道如何根据字符串创建一个动态捕获组?


3
为什么要使用捕获组?preg_match_all('/- .*/', $str, $matches); - AbraCadaver
偶尔会出现这个问题。在PHP PCRE正则表达式中,没有为每个捕获组设置堆栈。请使用上面所示的多重匹配。总有办法来解决这个限制。 - Wiktor Stribiżew
可能你正在进行替换操作... - AbraCadaver
1
也许可以举一个替换方法的例子。 - AbraCadaver
1
请看一下这个示例,是否有所帮助。 - bobble bubble
显示剩余5条评论
2个回答

3
无法捕获重复组是众所周知的限制
如果您知道最大重复模式,可以将正则表达式设置为(例如: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 ) ) ).'/';

上述模式可以工作,但我不知道你的确切替换条件,因此它可能无法满足你的目的。

这个 str_repeatpreg_match_all 返回值的结合是个非常好的想法(虽然不知道 OP 到底想要实现什么)。我稍微试了一下它的用法 :) 链接 - bobble bubble

2
使用m修饰符(多行):这将允许在每一行进行匹配。
尝试使用以下正则表达式:
 preg_match_all('/(\-\s\w+)/m', $str, $matches);
 print_r($matches);

回答不错,但是缺少一个 ' - elixenide
好的,但并不有帮助。请阅读评论以了解原帖作者想要做什么。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接