【问题标题】:How do I create a dynamic capturing group in regex?如何在正则表达式中创建动态捕获组?
【发布时间】:2016-06-01 11:03:19
【问题描述】:

我有一个这样的字符串:

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

我也有这个regex:

/(\-\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


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

【问题讨论】:

  • 为什么要捕获组? preg_match_all('/- .*/', $str, $matches);
  • 偶尔会出现这个问题。 PHP PCRE 正则表达式中的每个捕获组都没有堆栈。如上所示使用多重匹配。总有办法解决这个限制。
  • 呃,也许你正在做替换......
  • 也许可以举一个替代方法的例子。

标签: php regex string


【解决方案1】:

无法捕获重复组是well known limitation

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

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

您会在从 1​​ 到 5 的组中找到 1 到 5 个匹配项。
基本上,您必须重复 (\-\s\w+)?\n? 以获得最大可能的重复模式数。

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

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

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

【讨论】:

  • 这个str_repeat 的想法非常好,返回值为preg_match_all(不知道 OP 实际上到底想要实现什么)。 Played around with it a bit :)
【解决方案2】:

使用 m 修饰符(多行):这将使每一行都匹配。

尝试使用下面的正则表达式:

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

【讨论】:

  • 很好的答案,但缺少'
  • 很好但没有帮助。阅读 cmets 以了解 OP 想要做什么。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 2022-12-06
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2018-03-11
相关资源
最近更新 更多