3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
這會(huì)災(zāi)難性地回溯在最后一個(gè)結(jié)束</tag:main>
標(biāo)記之后出現(xiàn)的長(zhǎng)序列空間??紤]主題字符串以100個(gè)空格結(jié)尾的情況。首先,它將它們?nèi)颗c.
交替的左側(cè)相匹配。這失敗了,因?yàn)闆]有結(jié)束標(biāo)記,所以它嘗試匹配最后一個(gè)字符\s
。這也失敗了,所以它嘗試匹配倒數(shù)第二個(gè)空格作為a \s
和最后一個(gè)空格作為a .
。失?。ㄈ匀粵]有結(jié)束標(biāo)記)所以它嘗試最后一個(gè)空格作為\s
。當(dāng)失敗時(shí)它將第三個(gè)到最后一個(gè)空格匹配為a \s
并嘗試所有4種方式來匹配最后兩個(gè)空格。當(dāng)失敗時(shí),它會(huì)嘗試倒數(shù)第四個(gè)空格\s
以及最后3個(gè)空格中的所有8種方式。然后是16,32等。宇宙在它到達(dá)第100個(gè)到最后的空間之前結(jié)束。
由于災(zāi)難性的回溯,不同的VM對(duì)regexp匹配的反應(yīng)不同。有些人只會(huì)報(bào)告“不匹配”。在V8中,它就像編寫任何其他無限或近無限循環(huán)一樣。
使用非貪婪*
會(huì)做你想要的(你想要在第一個(gè)</tag:main>
而不是最后一個(gè)停止),但仍會(huì)對(duì)缺少關(guān)閉序列的長(zhǎng)串空間進(jìn)行災(zāi)難性的回溯。
確保內(nèi)括號(hào)中的相同字符不能與交替的兩側(cè)匹配將減少?gòu)闹笖?shù)一到一的問題,該問題在字符串的長(zhǎng)度上是線性的。使用字符類而不是替換或放在\n
交替欄的右側(cè)。 如果您按下一長(zhǎng)串空格,則正則表達(dá)式引擎在終止之前不會(huì)嘗試所有左右 - 左等組合\n
,.
因此是不相交的。

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
我認(rèn)為這是災(zāi)難性的追溯。
我認(rèn)為問題的一部分可能是dot和\ s不是互斥的。
如果我改變你的表達(dá)方式
<tag:main>((?:.|[\r\n])*)</tag:main>
并在Regex Buddy調(diào)試器中運(yùn)行它,如果測(cè)試字符串不匹配,它會(huì)更快地失敗。

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
(?:.|\s)*
您可以使用[^]*
匹配任何字符(包括各種形式的換行符)來代替。
沒有交替,所以沒有災(zāi)難性回溯的風(fēng)險(xiǎn)。
添加回答
舉報(bào)