【问题标题】:4 digit regex which maybe starts with 0可能以 0 开头的 4 位正则表达式
【发布时间】:2018-09-01 06:18:45
【问题描述】:
\b(0?[1-9]){4}

我有这个正则表达式 哪位能找到

1234 

但不是

0123

找到4位以上的01234

我的正则表达式的哪一部分是错误的?

【问题讨论】:

  • 想要 1234 匹配吗? (如果是这样,为什么不只是\d{4}?)
  • 仅供参考:你可以试试regexr.com
  • @CertainPerformance 是
  • 那么为什么不直接\d{4}呢?
  • 你要4位数字,第一个数字和其他3个数字可以是零吗?还是其他 3 位数字必须非零? (好的规范必须非常具体 - 程序/计算机需要)

标签: regex digits


【解决方案1】:

您的正则表达式的问题是您为 0 匹配指定了 ?,这意味着零匹配或一个匹配。因此,您可以匹配 5 位字符串(以及更大的字符串)作为结果。

问题是 ? 贡献 0 或 1,然后您的 1-9 测试总是贡献 1。您匹配 4 次,因此您可以匹配从 4 位到 8 位字符串的任何内容。

这是一个更简单的版本,您可以使用https://regexr.com/ 进行测试。

\b[0-9][1-9]{3}\b

这会测试第一个位置的 0-9,然后根据需要测试接下来的 3 个位置的 1-9。

示例输出

yes: 1234
yes: 0123
no:  01234
no:  12345
no:  0001
yes: 0125

【讨论】:

  • ty 简单的解决方案
  • 这显然比我的方法要好 - 不知道为什么我如此专注于交替。但是,如果允许中间 0s,我会保留我的答案。
  • "1-9 测试总是贡献 4" 不正确。 010407914020809080706 也匹配。解决方案是正确且直接的。
【解决方案2】:

您的量词用于整个组,因此您也可以将01020304 与您当前的正则表达式匹配。

在这种情况下,最简单的解决方案似乎是一种交替:

\b(?:0[1-9]{3}|[1-9]{4})\b

请注意,这不会匹配内部包含 0 的数字,例如 3000

但是,如果您只是想确保不匹配 0000,则可以改用前瞻

\b(?!0{4})\d{4}\b

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2014-11-13
    相关资源
    最近更新 更多