1 回答

TA貢獻1856條經驗 獲得超11個贊
說明
嵌套組不會自動導致災難性的回溯。在您的情況下,這是因為您的正則表達式退化為災難性回溯的經典示例(a*)*。
由于\s在可選in中^([a-zA-Z0-9'-]+\s?)*$,在輸入時沒有任何空格,但字符在允許列表之外,因此正則表達式簡單地退化為^([a-zA-Z0-9'-]+)*$。
您還可以考慮原始正則表達式的擴展:
[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'-]+...
并且我們得到了一系列連續的[a-zA-Z0-9'-]+,它們將嘗試所有方式在它們之間分配字符并消除復雜性。
解
編寫正則表達式進行匹配的標準方法token delimiter token ... delimiter token是token (delimiter token)*。雖然可以重寫regex避免重復token,但我建議不要這樣做,因為很難正確處理它。為了避免重復,您可能希望通過字符串串聯來構造正則表達式。
按照上面的食譜:
^[a-zA-Z0-9'-]+(\s[a-zA-Z0-9'-]+)*$
盡管您可以在這里看到重復中的重復,但是由于正則表達式只能擴展為:
[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 關注
- 463 瀏覽
添加回答
舉報