【问题标题】:Regex for matching certain numbers of digits用于匹配某些数字的正则表达式
【发布时间】:2012-10-22 03:34:19
【问题描述】:

以下正则表达式将匹配 9-11 位数字:/\d{9,11}/

编写完全匹配 9 个 11 个数字(不包括 10 个)的正则表达式的最佳方法是什么?

使用输入元素的模式属性,因此正则表达式应该匹配输入字段的整个值。我想接受任何包含 9 位或 11 位数字的数字。

【问题讨论】:

  • 我是否正确地假设您不想在更大的数字组中匹配 根本 9 个数字?您想查找具体包含 9 位数字或 11 位数字的行吗?另外,该行中是否还有其他内容?有些回答你问题的人显然对此感到困惑,我可能做出了错误的假设。
  • 如果您明确使用哪种工具或语言也会很有帮助,因为确切的语法不同。
  • 我已经在问题文本中包含了关于我想在哪个上下文中使用正则表达式的信息。

标签: regex validation


【解决方案1】:

嗯,你可以试试这样的:

^\d{9}(\d{2})?$

这完全匹配 9 位数字,后跟可选的额外两位数字(即 9 位或 11 位数字)。

或者,

^(\d{9}|\d{11})$

也可以。

但请记住,并非所有事情都必须使用正则表达式来完成。检查字符串是否匹配 ^\d*$ 以及字符串长度本身是否为 9 或 11(例如使用 strlen 之类的内容)可能同样容易。

【讨论】:

  • 谢谢,我想在输入的模式属性中使用它,所以我更喜欢使用单个正则表达式。
  • 您将匹配 10(或更多)内的 9 位数字或 12 或更多内的 11 位数字。我认为这不是 OP 想要的(尽管我可能错了)。
  • @Jørgen,然后使用我给出的第一个正则表达式。它可以正常工作,具体取决于您的正则表达式引擎(相对现代,因为它支持\d)。
  • @itsbruce,不,锚会处理这个问题——要么正好是 9,要么正好是 9,然后正好是 2。
  • 好的,既然 OP 已经澄清锚点在任何情况下都是隐含的,我不反对 ;)
【解决方案2】:

这个正则表达式会做

^(\d{9}|\d{11})$

或者如果你不想完全匹配它

\D(\d{9}|\d{11})\D

【讨论】:

  • 这将匹配仅包含 9 或 11 位数字且绝对没有其他内容的行。 OP 是否指定该行中不应有其他内容?
  • @itsbruce 他在他的问题中说完全正确
  • 他说他想精确匹配那么多数字。他没有说他们应该是唯一的事情。你做了一个毫无根据的假设。也许这就是 OP 想要的(我已经要求澄清),但没有具体说明。
  • 好吧,公平地说,OP 现在已经澄清了他想要什么。我只是在迂腐。
【解决方案3】:
/[^\d](\d{9}|\d{11})[^\d]/

根据您使用的工具,您可能需要转义 (|) 字符。

请注意,为了不匹配 8 或除 9 或 11 之外的任何其他数字,正则表达式必须用某些内容限定,以表明匹配被非数字字符包围。理想情况下,它将是某种字边界字符,但其语法会因工具而异。

/\b(\d{9}|\d{11})\b/

适用于一些工具。你在做什么?

【讨论】:

  • 谢谢,我在输入元素的模式属性中使用了正则表达式,所以它会自动被 ^ 和 $ 限制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2013-01-07
相关资源
最近更新 更多