【问题标题】:Regular Expression Scope Too Large正则表达式范围太大
【发布时间】:2019-06-10 12:50:17
【问题描述】:

我创建了一个(大部分)有效的正则表达式,它接受任何大于 0 或

我的正则表达式模式是/^\b(0*([0-9]|1[0-2]))\b\.?[0-9]{0,2}$/

如何更改此设置以防止 0 或大于 12 的数字被接受?

【问题讨论】:

  • 你必须对12进行特殊处理,然后你可以将[0-2] 改为[0-1]

标签: regex floating-point integer


【解决方案1】:

你可以使用

^(?=[^1-9]*[1-9])0*(?:(?:\d|1[01])?(?:\.[0-9]{0,2})?|12(?:\.0{0,2})?)$

查看regex demoregex graph

如果小数分隔符后面的数字是必需的,请将{0,2} 替换为{1,2}

^(?=[^1-9]*[1-9])0*(?:(?:\d|1[01])?(?:\.[0-9]{1,2})?|12(?:\.0{1,2})?)$

详情

  • ^ - 字符串开头
  • (?=[^1-9]*[1-9]) - 一个正向前瞻,需要一个非零数字(从19 的数字)在除19 的数字之外的任何字符之后
  • 0* - 任何 0+ 个前导零
  • (?: - 非捕获组的开始:
    • (?:\d|1[01])?(?:\.[0-9]{1,2})? - 011 数字(可选匹配,参见第一个右括号后的 ?)后跟可选的 . 序列和 1 到 2 位数字
    • | - 或
    • 12(?:\.0{1,2})? - 12 可选后跟 . 和 1 到 2 位数字
  • ) - 非捕获组结束
  • $ - 字符串结束

【讨论】:

  • 非常有帮助,谢谢。大多数情况下都有效,尽管它仍然接受 0。我如何也拒绝 0?
  • @JoeCoyle 对不起,我完全错过了那部分。将第一个 [0-9] 替换为 [1-9]。我更新了所有的演示和解释。
  • 谢谢,接近了!我可能应该在问题中更清楚地说明它,但我也想包括 0-1 之间的数字,例如 0.25。理想情况下,我们也可以考虑 .25 之类的格式,但这是可选的。
  • 那你需要^(?=[^1-9]*[1-9])0*(?:(?:\d|1[01])?(?:\.[0-9]{0,2})?|12(?:\.0{0,2})?)$,见regex101.com/r/WBwDeA/4
  • 优秀——完美运行。感激不尽!
猜你喜欢
  • 2014-10-12
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多