簡體   English   中英

PCRE正則表達式重疊匹配

[英]PCRE regular expression overlapping matches

我有以下字符串

001110000100001100001

而這個表達

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

這使得兩場比賽

火柴

但我希望它也能匹配兩者之間的模式,可以說,重疊的 1

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

一個常見的技巧是在未錨定的正向前瞻中使用捕獲技術。 將此正則表達式與preg_match_all

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

正則表達式演示

值在$matches[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM