【问题标题】:Regex to validate an alphanumeric string with optional space正则表达式验证带有可选空格的字母数字字符串
【发布时间】:2020-10-20 12:20:57
【问题描述】:

我一直在研究用于验证字母数字字符串的正则表达式,其规则如下:

  1. FOUR 个起始字符必须是数字,最后一个 两个字符必须是字母。

  2. 空格是可选,但必须放在两个字符之间, 表示不允许使用尾随空格。

  3. 如果 SPACE 是邮政编码的长度必须是 6 个字符 不包括7个字符如果空格是包括

例如。

  • 1111 ZZ
  • 111 1ZZ
  • 1111ZZ
  • 1111ZZ

我尝试使用^[0-9]{4}[A-Za-z]{2}$|^(?=[\d|\D]+ [\d|\D]+).{7}$,但这也验证了 9999 1A 为 TRUE,实际上应该为 FALSE。

任何线索或帮助将不胜感激:)

【问题讨论】:

  • 有什么特殊原因不能删除所有空格(前导、中间或尾随),并且仍然具有相同的语义“值”吗?

标签: javascript regex


【解决方案1】:
(?=^.{6,7}$)^(([0-9] ?){4}( ?[a-zA-Z]){2})$

将匹配

  • 1111 ZZ
  • 111 1ZZ
  • 1111ZZ
  • 1111ZZ
  • 1111 ZZ

但不是

  • 9999 1A
  • 11111 Z
  • 1111111
  • 11 11 ZZ

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

编辑:解释

“正向预测”部分:

  • (?=^.{6,7}$) 这仅在字符串满足要求时才匹配,但它不会“消耗”字符。
    • 。是任何字符
    • {6,7} 是关于重复

所以 (?=^.{6,7}$) 匹配如果字符串有 6 或 7 个字符,不管是什么

然后下面的部分已经“消耗”了字符串,说我想要在开始时重复 4 次数字和可选的空格,在结尾处重复 2 次字母和可选的空格。第二部分将接受 1 1 1 1 Z Z 等字符串,但由于这些字符串超过 7 个字符,因此第一部分不会让字符串匹配。

【讨论】:

  • 谢谢!解决了这个问题。你能解释一下正则表达式是如何工作的吗?这会有所帮助:)
【解决方案2】:

我建议提前简化问题,减少所有空白,无论如何您似乎都不感兴趣:

var candidate = input.replaceAll(/\s/mg, '');

那么正则表达式就是:/^\d{4}[A-Za-z]{2}$/

但是,如果您需要验证实际上没有前导或尾随空格,您可以提前验证,并立即返回否定结果。

【讨论】:

  • 删除空格后,[0-9A-Za-z]* 会出错(即验证“111111ZZ”),/^\d{4}[A-Za-z]{2}$/够了
  • @MaxXapi 你是对的。我忘记了“6 个字符”的限制。
【解决方案3】:

另一个选项是检查字符串在第一个和最后一个非空白字符之间是否包含可选空格。

然后匹配第一个数字,后跟 3 位数字,由可选的空格和 2 或 3 次字符 a-zA-Z 或空格分隔。

使用不区分大小写的匹配:

^(?=\S+ ?\S+$)\d(?: ?\d){3}[A-Z ]{2,3}$

说明

  • ^ 字符串开始
  • (?= 正向前瞻,断言右边是什么
    • \S+ ?\S+$匹配第一个和最后一个非空白字符之间的可选空格
  • )关闭前瞻
  • \d(?: ?\d){3}匹配一个数字并重复3次可选空格和一个数字
  • [a-zA-Z ]{2,3} 匹配 2-3 次字符 a-zA-Z 或空格
  • $ 字符串结束

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多