【问题标题】:How to create a matching regex pattern for "greater than 10-000-000 and lower than 150-000-000"?如何为“大于 10-000-000 且小于 150-000-000”创建匹配的正则表达式模式?
【发布时间】:2019-06-27 03:05:36
【问题描述】:

我正在努力

09-546-943

在下面的正则表达式模式中失败。

​^[0-9]{2,3}[-]{0,1}[0-9]{3}[-]{0,1}[0-9]{3}$

通过标准是
大于 10-000-000 或 010-000-000 和
小于 150-000-000

经过验证的示例“09-546-943”通过了。这应该是失败的。
知道如何创建一个使此示例失败而不是通过的正则表达式吗?

【问题讨论】:

  • “大于”是指整个字符串(不带破折号)作为一个数字大于,还是每个字符串部分作为一个数字都大于?
  • 是的。就像一千万到一亿五千万之间的数字验证。

标签: regex


【解决方案1】:

你可以使用

^(?:(?:0?[1-9][0-9]|1[0-4][0-9])-[0-9]{3}-[0-9]{3}|150-000-000)$

请参阅regex demo

模式部分是用this online number range regex generator生成的,我将最小值设置为10,最大值设置为150,然后合并匹配1-89的分支(该工具在这里做得不好),将0? 添加到两位数以匹配可选的前导0-[0-9]{3}-[0-9]{3} 用于10-149 部分和-000-000 用于150

regex graph

详情

  • ^ - 字符串开头
  • (?: - 容器非捕获组的开始,使锚点适用于两种选择:
    • (?:0?[1-9][0-9]|1[0-4][0-9]) - 一个可选的0,然后是一个从 10 到 99 的数字或 1,后跟一个从 0 到 4 的数字,然后是任何数字(100 到 149)
    • -[0-9]{3}-[0-9]{3} - 一个连字符和三个数字重复两次 (=(?:-[0-9]{3}){2})
  • | - 或
    • 150-000-000 - 150-000-000
  • ) - 非捕获组结束
  • $ - 字符串结束。

【讨论】:

  • 小更新... ^(?:(?:0?[1-9][0-9]|1[0-4][0-9])(-[0- 9]{3}){2}|150-000-000)$
  • @Hemang 我知道,我在解释中添加了该选项。但是,有些环境会标记嵌套量词的使用,而且这种模式并不长,所以重复两次似乎对我来说更具可读性。
【解决方案2】:

这个表达式或者稍微修改的版本可能会起作用:

^[1][0-4][0-9]-[0-9]{3}-[0-9]{3}$|^[1][0]-[0-9]{3}-[0-9]{2}[1-9]$

10-000-000150-000-000 也会失败。

在这个demo 中,解释了表达式,如果您可能感兴趣的话。

【讨论】:

  • 感谢您的演示。 010-000-001 失败,但通过 10-000-001。有什么想法吗?
【解决方案3】:

这种模式:

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

匹配从(0)10-000-000149-999-999 的范围。为了使正则表达式保持简单,您可能需要分别处理极端情况((0)10-000-000150-000-000) - 取决于您是否需要包含或排除它们。

测试here

这个正则表达式:

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

接受(空格)或不接受-

测试here

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 2013-04-18
    • 2020-10-14
    • 2022-07-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多