亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

沒有災難回溯的簡單字母數字正則表達式(單個間距)

沒有災難回溯的簡單字母數字正則表達式(單個間距)

胡子哥哥 2019-11-21 09:41:17
我有以下REGEX表達式(有效)以允許字母數字(以及'和-)并且沒有雙倍空格:  ^([a-zA-Z0-9'-]+\s?)*$由于嵌套分組,因此可以進行災難性的回溯-太糟糕了!如何簡化此表達式以避免災難性回溯? (理想情況下,第一個和最后一個字符都不允許有空格)
查看完整描述

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'-]是互斥的-只有一種方式來匹配任何字符串。


查看完整回答
反對 回復 2019-11-21
  • 1 回答
  • 0 關注
  • 463 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號