Php PCRE正则表达式重叠匹配
我有以下字符串Php PCRE正则表达式重叠匹配,php,regex,Php,Regex,我有以下字符串 001110000100001100001 这个表达式呢 /[1]....[1]/g 这是两场比赛 但我希望它也能匹配这两个元素之间的模式,也就是说,重叠的1 我完全不知道,这怎么行?它可以是任何字符,而不是0。一个常见的技巧是在未编排的正向前瞻中使用捕获技术。将此正则表达式与preg\u match\u all一起使用: (?=(1....1)) 看 委员会: 见: Lookaround实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断
001110000100001100001
这个表达式呢
/[1]....[1]/g
这是两场比赛
但我希望它也能匹配这两个元素之间的模式,也就是说,重叠的1
我完全不知道,这怎么行?它可以是任何字符,而不是0。一个常见的技巧是在未编排的正向前瞻中使用捕获技术。将此正则表达式与
preg\u match\u all
一起使用:
(?=(1....1))
看
委员会:
见:
Lookaround实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不使用字符串中的字符,而只声明匹配是否可能
如果要将正则表达式的匹配项存储在前瞻中,则必须在前瞻中的正则表达式周围放置捕获括号,如下所示:(?=(regex))
您还可以使用lookback中的
\K
功能(指返回结果的起始位置)执行此操作:
(?<=\K1)....1
(?/(模式)(.*)\1/
使用此选项并获取第二个捕获的组值。无需查找。如果需要完全匹配,请尝试(?:?)。?(?非常感谢,我已经用积极的前瞻性玩了arround,但做得不对,这很好,而且解释得很好。这是天才。这是我用正则表达式见过的最聪明的事情之一。谢谢!为我节省了很多时间。
(?<=\K1)....1
$str = '001110000100001100001';
preg_match_all('~ (?<= \K 1 ) .... 1 ~x', $str, $matches);
print_r($matches[0]);