2016-02-12 65 views
1

我可以成功驗證完整的加拿大郵政編碼(如"M1B0A1"),但是如何驗證字符串可以是不完整的加拿大郵政編碼(如"M1B")?如果稍後輸入更多字符,我想檢查現有內容是否可以匹配正則表達式。只要用戶輸入的字符串不可能是加拿大郵編的開頭,我想顯示一個錯誤。驗證該字符串是否爲正則表達式模式的開頭

我現有的用於驗證完整加拿大拉鍊正則表達式是:

^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] ?\d[ABCEGHJKLMNPRSTVWXYZ]\d$ 

我試圖通過使每個角色可選與此正則表達式來修改正則表達式:

^[ABCEGHJKLMNPRSTVXY]?\d?[ABCEGHJKLMNPRSTVWXYZ]? ?\d?[ABCEGHJKLMNPRSTVWXYZ]?\d?$ 

但隨後不正確地接受字符串如"777""HA16"。我可以用正則表達式來做到這一點,還是我將不得不創建一組不同字符串長度的正則表達式?我寧願避免像

switch(str.length) { 
    case 1: 
     return /[ABCEGHJKLMNPRSTVXY]/.test(str); 
    case 2: 
     return /[ABCEGHJKLMNPRSTVXY]\d/.test(str); 
    //.... and more 
} 
+0

您的初始正則表達式無效。它是'^([ABCEGHJKLMNPRSTVXY] \ d [ABCEGHJKLMNPRSTVWXYZ])?(\ d [ABCEGHJKLMNPRSTVWXYZ] \ d)$'?你甚至可以把它寫成:^([A-CEGHJ-NPR-TVXY] \ d [A-CEGHJ-NPR-TV-Z])(\ d [A-CEGHJ-NPR-TV-Z] $' –

+0

我想知道避免switch語句背後的原因,它導致可讀代碼,並選擇不可維護的正則表達式意大利麪? – Kano

+0

是的,這是相當不可讀的(儘管你可以把選擇放在不同的行上並定義塊,然後用RegExp構造函數構建模式,但仍然...):[''([A-CEGHJ-NPR-TVXY] | [A-CEGHJ-NPR-TVXY] \ d | [A-CEGHJ-NPR-TVXY] \ d [A-CEGHJ-NPR-TV-Z] | [A-CEGHJ-NPR-TVXY] \ d [A-CEGHJ [A-CEGHJ-NPR-TVXY] d [A-CEGHJ-NPR-TV-Z]→d- [A-CEGHJ-NPR-TVXY] [A-CEGHJ-NPR-TV-Z] | [A-CEGHJ-NPR-TVXY] \ d [A-CEGHJ-NPR-TV-Z]→d [A-CEGHJ -NPR-TV-Z] \ d)$'](https://regex101.com/r/eG9nK7/1) –

回答

1

解決方案1 ​​

我想你可以使用「或」 |並追加每個正則表達式模式從您發佈的switch-case列表中,這樣的正則表達式將幾乎爲你做了switch-case的工作。 編輯:儘管如此,每個case的順序應該相反,以便匹配大多數可能的字符。

模板

^(A|B|C|D|E|F)$ 

字母應從以下

A: the complete regex pattern    (Case 6) 
B: regex pattern for first 5 characters (Case 5) 
C: regex pattern for first 4 characters (Case 4) 
D: regex pattern for first 3 characters (Case 3) 
E: regex pattern for first 2 characters (Case 2) 
F: regex pattern for the first character (Case 1) 

最終的結果進行更換不漂亮:DEMO


編輯 [16-FEB-2016]

溶液2

爲了避免鍵入出每種情況下,可以巢任選的基團。每個組將代表每個郵政編碼字符的模式,以便當第一個字符正確匹配時,下一個字符將是可選的;那麼如果該字符匹配,則下一個字符將變爲可選字段,依此類推。 (這可能是你在第二個正則表達式中試圖做的)

模板

^(A(B(C(D(E(F)?)?)?)?)?)$ 

如下

A: regex pattern for the 1st zip code character 
B: regex pattern for the 2nd zip code character 
C: regex pattern for the 3rd zip code character 
D: regex pattern for the 4th zip code character 
E: regex pattern for the 5th zip code character 
F: regex pattern for the 6th zip code character 

結果的字母應該更換DEMO

^(\[ABCEGHJKLMNPRSTVXY\](\d(\[ABCEGHJKLMNPRSTVWXYZ\](?(\d(\[ABCEGHJKLMNPRSTVWXYZ\](\d)?)?)?)?)?)?)$ 

此外,如果你對捕獲的組不感興趣,那麼你可以修改上面的使用非捕獲組:DEMO。這是你的電話。

+0

是的。解決方案2是我當時正在尋找的。我從那以後決定重新評估我的驗證邏輯,但那正是我想要的。一種解決額外可選字符的方法。 – ryanyuyu

-1

我改變你的正則表達式來^[ABCEGHJKLMNPRSTVXY](?:(?:\d$)|(?:\d[ABCEGHJKLMNPRSTVWXYZ]$)|(?:\d[ABCEGHJKLMNPRSTVWXYZ]\d$)|(?:\d[ABCEGHJKLMNPRSTVWXYZ]\d[ABCEGHJKLMNPRSTVWXYZ]$)|(?:\d[ABCEGHJKLMNPRSTVWXYZ]\d[ABCEGHJKLMNPRSTVWXYZ]\d$))?$

基本上是分以下的正則表達式^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]\d[ABCEGHJKLMNPRSTVWXYZ]\d$成6個部分,這是每一個數字,比我做的第一個obrigatory以及隨後的可選,確保您想要的順序,也就是說,如果一個數字被跳過,它將接受,如果這是字符串的結尾,或者如果在跳過的數字後有更多數字,則接受。

我認爲這是你想要的,這裏是一個regex101 test

+0

@ryanyuyu你認爲什麼是不完整的加拿大郵編?任何至少1個字符長? –

+0

是的。 1到6個字符之間的任何內容。任何可能的字符串,如果正確的字符被添加到它,仍然是一個有效的zip。正如很多評論所建議的那樣,使用正則表達式替代'|'或只是javascript邏輯是必要的。 – ryanyuyu

+0

@ryanyuyu剛剛編輯正則表達式,請再次檢查。 –

相關問題