我有以下字符串
001110000100001100001
和这个表达
/[1]....[1]/g
这使得两场比赛
但我希望它也匹配那些与lookbehind相比的模式,所以说,重叠1
我完全不知道,这怎么可行?而不是0,它可以是任何字符
答案 0 :(得分:6)
一个常见的诀窍是在未经发现的正向前瞻中使用捕获技术。将此正则表达式与preg_match_all
:
(?=(1....1))
请参阅regex demo
$re = "/(?=(1....1))/";
$str = "001110000100001100001";
preg_match_all($re, $str, $matches);
print_r($matches[1]);
Lookaround实际匹配字符,但随后放弃匹配,仅返回结果:匹配或不匹配。这就是为什么他们被称为"断言"。它们不消耗字符串中的字符,但仅断言是否可以匹配。
如果你想将正则表达式的匹配存储在前瞻中,你必须在前瞻中的正则表达式周围放置捕获括号,如下所示:{{1 }}。
答案 1 :(得分:1)
您还可以使用后视中的 \K
功能(指返回结果的开始位置)来完成此操作:
(?<=\K1)....1
这种方式,您不需要创建捕获组,并且由于所有字符都被消耗了(除了在后视中的第一个字符),正则表达式引擎不必为接下来的五个位置重试模式成功后。
$str = '001110000100001100001';
preg_match_all('~ (?<= \K 1 ) .... 1 ~x', $str, $matches);
print_r($matches[0]);
请注意,如果您确定第二个字符始终为零,则使用 0(?<=\K10)...1
的性能更高,因为该模式以文字字符开头,并且 pcre 能够通过快速搜索可能的位置来优化它主题字符串。