【问题标题】:How to edit a regex to also accept unfinished inputs in the right format?如何编辑正则表达式以接受正确格式的未完成输入?
【发布时间】:2021-02-11 13:37:01
【问题描述】:

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

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

它接受像 1234ab1234 ab 这样的任何东西,这正是我想要的。

但是当用户输入代码时,我该如何编辑这个正则表达式?

  • 1 -> 正确
  • 12 -> 是的
  • 12r ->
  • 1234 a -> 是的
  • 1234ab -> 真的
  • 1234 abc ->

【问题讨论】:

  • 这有点“实施过度杀伤力”的味道——问问自己,你真的需要增加这种复杂性吗?当用户完成输入时,与仅验证整个输入是否正确相比,这真的会增加很多价值吗?
  • 不要在 keypress/keydown/keyup 上验证。验证 onChange。
  • @WiktorStribiżew 除非您正确监听事件并使用 2 个正则表达式,否则这会让用户提交不完整的数据。
  • @TomLord 我需要这个来进行搜索输入。用户应该能够输入他/她的邮政编码并立即获得诸如 Input: 123 Suggested: 1234 AB - Sometone 之类的建议; 1235 AC - 某地
  • 对 Wiktor 的正则表达式稍作修改,以解决 12r 错误:^[1-9](?:[0-9]{1,3}|[0-9]{3} ?(?!sa|sd|ss)[a-z]{0,2})?$ regex101.com/r/gEu935/1

标签: javascript regex validation ecmascript-6


【解决方案1】:

我没有看到你的 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 位数字,后跟邮政编码字母部分的规则
  • ) - 关闭非捕获组
  • ? - 非捕获组是可选的
  • $ - 结束字符串锚

https://regex101.com/r/gEu935/1


注意:我的回答是wiktor-stribiżewwiktor-stribiżew在帖子的 cmets 中提供的正则表达式的略微修改版本

【讨论】:

    【解决方案2】:

    另一种选择是

    ^[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 位数字后跟右侧的 char a-z
    • \d{0,3} ? 匹配 0-3 位数字和可选空格
    • [a-z]{0,2} 匹配 0-2 个字符 a-z
    • $(?&lt;!s[ads]) 断言字符串的结尾并断言它不以sa 结尾sdss

    Regex demo

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

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 2023-03-24
      相关资源
      最近更新 更多