验证字符串是否为正则表达式模式的开头
Validate that string is the beginning of a regex pattern
我可以成功验证完整的加拿大邮政编码(如"M1B0A1"
(,但如何验证字符串可以是不完整的加拿大邮政编码(如"M1B"
(? 我想检查如果以后键入更多字符,现有内容是否可以与正则表达式匹配。 一旦用户输入一个不可能是加拿大 zip 开头的字符串,我想显示一个错误。
我现有的用于验证完整加拿大邮政编码的正则表达式是:
^[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
}
解决方案 1
我想您可以使用"OR"|
并从您发布的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)
最终结果并不漂亮:演示
<小时 />编辑 [2016 年 2 月 16 日]
解决方案 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
结果(演示(
^('[ABCEGHJKLMNPRSTVXY']('d('[ABCEGHJKLMNPRSTVWXYZ']( ?('d('[ABCEGHJKLMNPRSTVWXYZ']('d)?)?)?)?)?)?)$
此外,如果您对捕获的组不感兴趣,则可以修改上述内容以使用非捕获组:DEMO。您决定。
我将您的正则表达式更改为^[ABCEGHJKLMNPRSTVXY](?:(?:'d$)|(?:'d[ABCEGHJKLMNPRSTVWXYZ]$)|(?:'d[ABCEGHJKLMNPRSTVWXYZ]'d$)|(?:'d[ABCEGHJKLMNPRSTVWXYZ]'d[ABCEGHJKLMNPRSTVWXYZ]$)|(?:'d[ABCEGHJKLMNPRSTVWXYZ]'d[ABCEGHJKLMNPRSTVWXYZ]'d$))?$
基本上,它将以下正则表达式^[ABCEGHJKLMNPRSTVXY]'d[ABCEGHJKLMNPRSTVWXYZ]'d[ABCEGHJKLMNPRSTVWXYZ]'d$
分为 6 个部分,即每个数字,而不是我使第一个是可访问的,接下来的几个是可选的,确保您想要的顺序,也就是说,如果跳过一个数字,它将接受如果这是字符串的末尾,或者如果跳过一个数字后有更多数字,它将失败。
我认为这就是你想要的,这是一个正则表达式101测试。
- Javascript,访问一个主要对象模块模式中的每个对象
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 同位素库错误:未捕获错误无布局模式包装生产线8
- 对id以某个字符串开头的元素进行计数
- 在DOM中查找一个模式并替换它's的内容使用jquery
- 如何缩短MongoDB ObjectId并在Mongoose模式中使用它
- 如果元素's的ID以数字开头
- D3.js模式不适用于弧形或圆环图
- Webdriver.io pageObject模式-通过传递参数来定义元素选择器
- 模块模式和这个
- 带有let的JS/EECMAScript6私有字段的模式
- 我是否可以检测到javascript正在被卸载(作为调试模式)
- 验证模式中的HTML5不适用于以一些特定字符开头的字符串
- 验证字符串是否为正则表达式模式的开头
- 仅当正则表达式不以 javascript 中的模式开头时才匹配正则表达式
- 如何将以特定模式开头的每一行转移到字符串的末尾
- 以字符开头、以数字结尾的字符串的模式匹配
- Javascript用于regex检查是否包含以字符串开头的模式
- 仅在字符串的开头或末尾使用javascript中的regex匹配模式