如何在重复的反向引用中获得所有匹配?

时间:2018-05-25 14:29:47

标签: php regex

使用测试字符串:

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

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

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

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

最终会以string7的匹配结束。

到目前为止,我发现的最好的方法是移除上面的?:并在空格上爆炸,但我感兴趣的是,是否有纯粹的方法可以做到这一点正则表达式。

更新专门针对PHP,实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用\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]);