繁体   English   中英

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

[英]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+) ,我想根据字符串中匹配项的数量创建一个单独的捕获组。 野兔是几个例子:

范例1:

$str="
- group 1
";

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


范例2:

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

我需要一个正则表达式来给我第一行字符串( - group 1$1 ,第二行( - group 2$2


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

使用m-修饰符(多行):可以使每行匹配。

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

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

捕获重复基团的可能性是众所周知的限制

如果您知道最大重复模式,则可以将正则表达式设置为(即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 ) ) ).'/';

上面的模式可以使用,但是我不知道您要完全替换的条件,因此它可能无法用于您的目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM