[英]PCRE regular expression overlapping matches
一個常見的技巧是在未錨定的正向前瞻中使用捕獲技術。 將此正則表達式與preg_match_all
:
(?=(1....1))
$re = "/(?=(1....1))/";
$str = "001110000100001100001";
preg_match_all($re, $str, $matches);
print_r($matches[1]);
請參閱 前瞻參考:
Lookaround 實際上匹配字符,但隨后放棄匹配,只返回結果:匹配或不匹配。 這就是為什么它們被稱為“斷言”。 它們不消耗字符串中的字符,而只斷言匹配是否可能。
如果要將正則表達式的匹配存儲在 lookahead 中,則必須在 lookahead中的正則表達式周圍放置捕獲括號,如下所示:
(?=(regex))
。
您還可以使用后視中的\\K
功能(指的是返回結果的開始位置)來完成此操作:
(?<=\K1)....1
這樣,您不需要創建捕獲組,並且由於所有字符都被消耗了(除了后視中的第一個字符),正則表達式引擎在成功后不必為接下來的五個位置重試模式.
$str = '001110000100001100001';
preg_match_all('~ (?<= \K 1 ) .... 1 ~x', $str, $matches);
print_r($matches[0]);
請注意,如果您確定第二個字符始終為零,則使用0(?<=\\K10)...1
的性能更高,因為該模式以文字字符開頭,並且 pcre 能夠通過快速搜索主題字符串中的可能位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.