您如何在重复的反向引用中获得所有匹配项? [复制]

Posted

技术标签:

【中文标题】您如何在重复的反向引用中获得所有匹配项? [复制]【英文标题】:How do you get all matches in a repeated backreference? [duplicate] 【发布时间】:2018-05-25 14:29:46 【问题描述】:

带有测试字符串:

This is a string1 string2 string3 string4 string5 string6 string7 so it is.

是否可以将所有 stringX 作为反向引用?目前我尝试过的每次都会覆盖,所以我最终得到一场比赛 - 最后一场。

例如使用这样的正则表达式:

/This is a (?:(string\d) )+so it is./

最后总是会匹配到string7

到目前为止,我发现的最好的方法是删除上面的 ?: 并在空格上爆炸,但我想知道是否有办法完全使用正则表达式。

更新专门针对 php,实现此目的的最佳方法是什么?

【问题讨论】:

不能用“正则表达式”完成,因为任何正则表达式都在代码中使用。你的是什么?请注意,获取所有 捕获 仅适用于几种语言。 最小的例子是在 PHP 中使用 preg_match 和上面的 caluss,但我不想将它限制为一种语言。我想我可以指定 PCRE,但我实际上只是在询问正则表达式。 味道/环境如何? @Aran-Fey 啊,你是对的,我一直在寻找类似的答案,但失败了。我可能应该删除这个很好回答的问题。 无需删除 - 您可以将自己的问题标记为该问题的副本。您的问题可以作为其他有相同问题的人的路标。 【参考方案1】:

您可以通过 \G 使用此正则表达式:

(?:This is a|\G(?!\A))\h+((?=.*so it is\.)string\d+)
\G 断言位置在上一个匹配的结尾或第一个匹配的字符串的开头 (?!\A) 是否定前瞻断言我们在行开始时不匹配 \G (?=.*so it is\.) 是肯定的超前断言我们在输入中的当前位置之前有so it is.

RegEx Demo

代码:

$re = '/(?:This is a|\G(?!\A))\h+((?=.*so it is\.)string\d+)/m';
$str = 'This is a string1 string2 string3 string4 string5 string6 string7 so it is.';

preg_match_all($re, $str, $matches);

// Print the entire match result
print_r($matches[1]);

【讨论】:

以上是关于您如何在重复的反向引用中获得所有匹配项? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式反向引用乘法[重复]

如何从 List<string> 中查找所有重复项? [复制]

如何设计保留历史而不重复的数据库模式?

Java中的正则表达式反向引用

如何使用正则表达式查找具有特定起始字符串的所有匹配项? [复制]

如何在没有顺序重复的情况下获得 PHP 中的所有排列?