我可以成功驗證完整的加拿大郵政編碼(如"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
}
您的初始正則表達式無效。它是'^([ABCEGHJKLMNPRSTVXY] \ d [ABCEGHJKLMNPRSTVWXYZ])?(\ d [ABCEGHJKLMNPRSTVWXYZ] \ d)$'?你甚至可以把它寫成:^([A-CEGHJ-NPR-TVXY] \ d [A-CEGHJ-NPR-TV-Z])(\ d [A-CEGHJ-NPR-TV-Z] $' –
我想知道避免switch語句背後的原因,它導致可讀代碼,並選擇不可維護的正則表達式意大利麪? – Kano
是的,這是相當不可讀的(儘管你可以把選擇放在不同的行上並定義塊,然後用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) –