1 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
說明
嵌套組不會(huì)自動(dòng)導(dǎo)致災(zāi)難性的回溯。在您的情況下,這是因?yàn)槟恼齽t表達(dá)式退化為災(zāi)難性回溯的經(jīng)典示例(a*)*。
由于\s在可選in中^([a-zA-Z0-9'-]+\s?)*$,在輸入時(shí)沒有任何空格,但字符在允許列表之外,因此正則表達(dá)式簡單地退化為^([a-zA-Z0-9'-]+)*$。
您還可以考慮原始正則表達(dá)式的擴(kuò)展:
[a-zA-Z0-9'-]+\s?[a-zA-Z0-9'-]+\s?[a-zA-Z0-9'-]+\s?[a-zA-Z0-9'-]+\s?...
由于\s是可選的,因此我們可以將其刪除:
[a-zA-Z0-9'-]+[a-zA-Z0-9'-]+[a-zA-Z0-9'-]+[a-zA-Z0-9'-]+...
并且我們得到了一系列連續(xù)的[a-zA-Z0-9'-]+,它們將嘗試所有方式在它們之間分配字符并消除復(fù)雜性。
解
編寫正則表達(dá)式進(jìn)行匹配的標(biāo)準(zhǔn)方法token delimiter token ... delimiter token是token (delimiter token)*。雖然可以重寫regex避免重復(fù)token,但我建議不要這樣做,因?yàn)楹茈y正確處理它。為了避免重復(fù),您可能希望通過字符串串聯(lián)來構(gòu)造正則表達(dá)式。
按照上面的食譜:
^[a-zA-Z0-9'-]+(\s[a-zA-Z0-9'-]+)*$
盡管您可以在這里看到重復(fù)中的重復(fù),但是由于正則表達(dá)式只能擴(kuò)展為:
[a-zA-Z0-9'-]+\s[a-zA-Z0-9'-]+\s[a-zA-Z0-9'-]+\s[a-zA-Z0-9'-]+...
而\s和[a-zA-Z0-9'-]是互斥的-只有一種方式來匹配任何字符串。
- 1 回答
- 0 關(guān)注
- 460 瀏覽
添加回答
舉報(bào)