小議正規表示式效率 貪婪 非貪婪與回溯

2022-10-06 20:45:18 字數 987 閱讀 2949

先掃盲一下什麼是正規表示式的貪婪,什麼是非貪婪?或者說什麼是匹配優先量詞,什麼是忽略優先量詞?

好吧,我也不知道概念是什麼,來舉個例子吧。

某同學想過濾之間的內容,那是這麼寫正則以及程式的。

複製** **如下:

$str = preg_replace('%%i','',$str);//非貪婪

看起來,好像沒什麼問題,其實則不然。若

複製** **如下:

$str = 'alert(documentwww.cppcns.com.cookie)';

那麼經過上面的程式處理,其結果為

複製** **如下:

$str = 'alert(document.cookie)';

$str = preg_replace('%%i','',$str);//非貪婪

print_r($str);

//$str 輸出為

仍然達不到他想要的效果。上面的就是非貪婪,也有的叫惰性。其標誌非貪婪的標識為量數元字元後面加? ,比如 +?、*?、??(比較特殊,以後的blog中,我會寫到)等。即標識非貪婪,如果不寫?就是貪婪。比如

複製** **如下:

$str = 'alert(document.cookie)';

$str = preg_replace('%%i','',$st程式設計客棧r);//非貪婪

print_r($str);

//$str 輸出為 "; //長度大於100014

$ret www.cppcns.com= preg_repalce($reg, "", $str); //返回null

其原因就是回溯太多了,直到造成耗盡棧空間爆棧。

再來看個例子。

字串

複製** **如下:

$str = 'www.cppcns.compt>123456';

正規表示式為

複製** **如下:

$strregex1 = '%

正規表示式 貪婪與非貪婪

在一段時間內,一直不知道.和.之間的區別,一直單純的覺得兩者之間並沒有什麼區別,都是匹配任意字元,知道今天才知道其中的區別 首先從乙個簡單的問題的問題開始思考 有這樣乙個字串aaabaaab,和這樣的乙個正則.b,那麼.匹配的會是aaab還是aaabaaab呢?由此問題引發出來的就是貪婪與非貪婪模式...

正規表示式 貪婪與非貪婪匹配

貪婪匹配與非貪婪匹配 貪婪匹配 預設情況下,正規表示式使用最長匹配原則 也叫貪婪匹配原則 例如 要將 zoom 中匹配 zo?的部 分替換成 r 替換的的結果是 rom 如果要將 zoom 中匹配 zo 的部分替換成 r 替換後的結果是 rm 非貪婪匹配 當字元?緊隨其他限定符 之後時,匹配模式變成...

正規表示式貪婪與非貪婪模式

之前做程式的時候看到過正規表示式的貪婪與非貪婪模式,今天用的時候就想不起來了,現在這裡總結一下,以備自己以後用到注意。1.什麼是正規表示式的貪婪與非貪婪匹配 如 string str abcaxc patter p ab c 貪婪匹配 正規表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使...