【问题标题】:Regular expression to match defined length number with leading zeros正则表达式将定义的长度数字与前导零匹配
【发布时间】:2014-07-23 21:20:44
【问题描述】:

我想使用正则表达式来匹配具有定义长度和前导零的数字。例如数字长度为 6:

"000123" //Match
"002535" //Match
"2654" //No match
"000021" //Match

我可以使用哪个正则表达式?

【问题讨论】:

  • \d{6} 只允许 6 位数字,无论数字是什么。
  • 那么123456 是否有效匹配?
  • 000000 是否有效匹配?

标签: regex


【解决方案1】:

当然这是最简单的:

^0\d{5}$

虽然问题中没有将其作为要求说明,但要排除全零输入,请对该情况使用否定的前瞻性:

^(?!0+$)0\d{5}$

【讨论】:

  • +1,呃……比我的好多了(删除它)。但需要锚。
  • @zx81 我已经用你的想法发布了一个拒绝000000的工作正则表达式;)
  • @Bohemian 非常聪明 ;) 我通常避免在 Java 中进行前瞻和后瞻,因为它们的实现存在严重错误。 (+1)
【解决方案2】:

如果000000 是有效匹配,请使用the answer by @Bohemian♦.

如果000000 不被允许,请在他的回答中使用这个变体(请接受他的回答不是我的):

^(?=0+[1-9])0\d{5}$

查看 the demo 中的匹配项。

说明

  • ^ 锚断言我们位于字符串的开头
  • 前瞻 (?=0+[1-9]) 断言后面是任意数量的零,后跟一个字符,即 1 或 9
  • 0 匹配一个零
  • \d{5} 匹配五位数字
  • $ 锚断言我们在字符串的末尾

参考

【讨论】:

  • 谢谢,@anubhava! :)
  • 你的第一个正则表达式也匹配000000,因为\d也匹配0
【解决方案3】:

实际上,如果您允许从 0 到 9 恰好六 (6) 位数字的任意组合,则正则表达式将是

^\d{6}$

如果您只允许五 (5) 个任意数字和至少一个前导零,请使用

^0\d{5}$

改为。

如果你想禁止000000,你需要先行:

^(?=\d{6}$)\d*[1-9]\d*

最后,如果您想禁止 000000 并强制使用前导 0,请使用

^(?=\d{6}$)0\d*[1-9]\d*

【讨论】:

  • 有一个更简单的方法来禁止000000。只需将其用作 or 的第一个模式,然后捕获另一个模式。 ^000000$|^(0\d{5})$
猜你喜欢
  • 1970-01-01
  • 2011-06-17
  • 2016-04-02
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
相关资源
最近更新 更多