如何编辑一个正则表达式也接受未完成的输入在正确的格式?



我尝试用JavaScript验证荷兰邮政编码。我有一个可行的解决方案,可以接受完整的邮政编码:

var dutchRegex = /^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/i

它接受像1234ab1234 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-z
  • d{0,3} ?匹配0-3位数字和可选空格
  • [a-z]{0,2}匹配0-2字符a-z
  • $(?<!s[ads])断言字符串的结束,并断言它不以sasdss结束

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)}`));

相关内容

  • 没有找到相关文章