2016-08-03 112 views
2

這是我下面的正則表達式:現場輸入驗證

/^08(17|18|19|31|32|33|38|59|77|78)[0-9]{0,8}$/ 

,如果我把08在輸入欄中將顯示通知的錯誤,我要的是,如果我輸入0817將顯示成功,如果我輸入08我想不會出現通知錯誤。也許解決方案是使用不要在正則表達式中捕獲組。但如何做到這一點?

這是我的前綴驗證我想要什麼:

0817, 0818, 0819, 0831, 0832, 0833, 0838, 0859, 0877, 0878 
+0

你能告訴我們你想要匹配的全部範圍嗎?您當前的正則表達式也不會匹配'0817'。 –

+0

我認爲'08'應該是變化的一部分:'/ ^(08 | 17 | 18 | 19 | 31 | 32 | 33 | 38 | 59 | 77 | 78)[0-9] {0,8} $ /'?最好是用'/ ^(08 | 1 [7-9] | 3 [1238] | 59 | 7 [78])[0-9] {0,8} $ /'。 –

+0

你應該更新這個問題的相關進展和細節,而不是發佈[重複問題](http://stackoverflow.com/questions/38740717/prefix-validation-with-regular-expression)。現在,我明白了,你需要允許'08',然後僅從組2位數據塊。嘗試['^ 08 [0-9] {0,8})$'(:(?: 17 | 18 | 19 | 31 | 32 | 33 | 38 | 59 | | 77 78?)?(HTTPS:/ /regex101.com/r/xC7mT4/3)。或者更高效的['^ 08(?:(?: 1 [789] | 3 [1-38] | 59 | 7 [78])[0-9] {0,8})?$'](https ://regex101.com/r/xC7mT4/4)。如果有任何的工作原理,你所期望的方式,請發表評論,這樣我可以張貼與解釋的答案。 –

回答

1

你想實現一個現場輸入驗證您的代碼的包括4位的前綴集,然後0-8任意數字。

的一點是,你不能讓子模式可選順序,你需要使用嵌套可選組要求左手位是右手的人之前存在。

模式變得相當凌亂,但這是使它工作的唯一辦法:

^0(?:8(?:1(?:[789][0-9]{0,8})?|3(?:[1238][0-9]{0,8})?|5(?:9[0-9]{0,8})?|7(?:[78][0-9]{0,8})?)?)?$ 

regex demo

詳細

  • ^ - 字符串的開始
  • 0 - 強制性0
  • (?:
    • 8 - 強制性8
      • (?:
      • 1 - 強制性1隨後...
      • (?: - 任選的組匹配要麼...
        • [789] - 7,或者8,或9隨後用
        • [0-9]{0,8} - 0-8 任何數字
      • )? - (任選的組的端1後)
      • | - 或
      • 3(?:[1238][0-9]{0,8})? - (與上述相似)
      • | - 或
      • 5(?:9[0-9]{0,8})? - (類似於上文)
      • | - 或
      • 7(?:[78][0-9]{0,8})? - (類似於上文)
    • )? - 所述可選組的端部相匹配的8之後全部
  • )? - 第一個0之後的整個部分是可選
  • $ - 字符串結尾。
+1

好工作夥計thx你的工作 –

+0

它看起來像我有一個額外的冗餘組,刪除並添加解釋。 –

+1

非常好,謝謝兄弟 –

0

你並不需要一個非捕獲組。您只需要?作爲可選事件。它將被視爲0或1次有效。

/^08(17|18|19|31|32|33|38|59|77|78)?[0-9]{0,8}$/ 

證明:https://regex101.com/r/xC7mT4/1

+0

當我把08仍然發佈通知錯誤 –

+0

我已經用驗證證明更新了答案。也許你應該複製錯誤在這裏爲我們看到 –