我尝试用JavaScript验证荷兰邮政编码。我有一个可行的解决方案,可以接受完整的邮政编码:
var dutchRegex = /^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/i
它接受像1234ab或1234 ab这就是我想要的。
但是我如何编辑这个正则表达式的工作,而用户输入代码?
- 1→真正的
- 12→真正的
- 12 r→假
- 1234a ->真正的
- 1234 ab ->真正的
- 1234 abc ->假
我没有看到你的Javascript,所以我假设你正在使用某种形式的keydown/keypress/keyup事件监听器来告诉用户他们的输入与预期的格式不匹配。
你可以使用这个正则表达式:
^[1-9](?:[0-9]{1,3}|[0-9]{3} ?(?!sa|sd|ss)[a-z]{0,2})?$
^[1-9]
-以数字1到9开头的字符串(?:
-启动非捕获组[0-9]{1,3}
-我们可以有1到3个数字|
-或[0-9]{3} ?(?!sa|sd|ss)[a-z]{0,2}
-邮政编码 要求3位数字后面跟着alpha部分的规则
)
-关闭非捕获组?
-非捕获组是可选的$
- end string anchor
https://regex101.com/r/gEu935/1
注:我的答案是一个稍微修改版本的正则表达式提供在帖子的评论wiktor-stribiżew
另一个选项可以是
^[1-9](?!d{0,2} ?[a-z])d{0,3} ?[a-z]{0,2}$(?<!s[ads])
模式匹配
^
起始字符串[1-9]
匹配数字1-9(?!d{0,2} ?[a-z])
负向前看断言不是0-2位数字后面跟着字符a-zd{0,3} ?
匹配0-3位数字和可选空格[a-z]{0,2}
匹配0-2字符a-z$(?<!s[ads])
断言字符串的结束,并断言它不以sa
sd
或ss
结束
Regex演示
const regex = /^[1-9](?!d{0,2} ?[a-z])d{0,3} ?[a-z]{0,2}$(?<!s[ads])/;
["1",
"12",
"123",
"1234",
"1234 ",
"1234 a",
"1234 ab",
"123r",
"12r",
"1r",
"r",
"1234 sa",
"1234 sd",
"1234 ss",
"1234 abc"
].forEach(s => console.log(`${s} ==> ${regex.test(s)}`));