PCRE正则表达式重叠匹配

时间:2016-02-17 13:34:57

标签: php regex

我有以下字符串

001110000100001100001

和这个表达

/[1]....[1]/g

这使得两场比赛

matches

但我希望它也匹配那些与lookbehind相比的模式,所以说,重叠1

我完全不知道,这怎么可行?而不是0,它可以是任何字符

2 个答案:

答案 0 :(得分:6)

一个常见的诀窍是在未经发现的正向前瞻中使用捕获技术。将此正则表达式与preg_match_all

一起使用
(?=(1....1))

请参阅regex demo

values are in $matches[1]

$re = "/(?=(1....1))/"; 
$str = "001110000100001100001"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);

请参阅lookahead reference

  

Lookaround实际匹配字符,但随后放弃匹配,仅返回结果:匹配或不匹配。这就是为什么他们被称为"断言"。它们不消耗字符串中的字符,但仅断言是否可以匹配。

     

如果你想将正则表达式的匹配存储在前瞻中,你必须在前瞻中的正则表达式周围放置捕获括号,如下所示:{{1 }}。

答案 1 :(得分:1)

您还可以使用后视中的 \K 功能(指返回结果的开始位置)来完成此操作:

(?<=\K1)....1

demo

这种方式,您不需要创建捕获组,并且由于所有字符都被消耗了(除了在后视中的第一个字符),正则表达式引擎不必为接下来的五个位置重试模式成功后。

$str = '001110000100001100001';

preg_match_all('~ (?<= \K 1 ) .... 1 ~x', $str, $matches);

print_r($matches[0]);

code

请注意,如果您确定第二个字符始终为零,则使用 0(?<=\K10)...1 的性能更高,因为该模式以文字字符开头,并且 pcre 能够通过快速搜索可能的位置来优化它主题字符串。

相关问题