简体   繁体   中英

PCRE regular expression overlapping matches

i have the following string

001110000100001100001

and this expression

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

this makes two matches

火柴

but i want it to also match the pattern between those both with lookbehind so to say, the overlapping 1

i have absolutely no clue, how can this work ? instead of 0 it can be any characters

A common trick is to use capturing technique inside an unanchored positive lookahead. Use this regex with preg_match_all :

(?=(1....1))

See regex demo

The values are in $matches[1] :

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

See lookahead reference :

Lookaround actually matches characters, but then gives up the match, returning only the result: match or no match. That is why they are called "assertions". They do not consume characters in the string, but only assert whether a match is possible or not.

If you want to store the match of the regex inside a lookahead , you have to put capturing parentheses around the regex inside the lookahead , like this: (?=(regex)) .

You can also do it using the \\K feature (that refers to where the returned result begins) inside a lookbehind:

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

demo

This way, you don't need to create a capture group, and since all characters are consumed (except the first that is in the lookbehind), the regex engine doesn't have to retry the pattern for the next five positions after a success.

$str = '001110000100001100001';

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

print_r($matches[0]);

code

Note that if you are sure the second character is always a zero, using 0(?<=\\K10)...1 is more performant because the pattern starts with a literal character and pcre is able to optimize it with a quick search of possible positions in the subject string.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM