【问题标题】:Regex : Match 1 to 60 or all正则表达式:匹配 1 到 60 或全部
【发布时间】:2011-08-29 12:45:24
【问题描述】:

我需要一些关于 php (Symfony) 中的正则表达式的帮助。

我想匹配值 1 到 60 或字符串。

对于我使用的号码:^([1-5]?[0-9]|60) 但它匹配 0 ...我现在不知道如何匹配“全部”。

你能帮帮我吗? 非常感谢之前

【问题讨论】:

  • 我觉得数字范围检查不应该在正则表达式中。

标签: php regex string


【解决方案1】:

您应该能够将其分为以下几种可能性:

^([1-9]|[1-5][0-9]|60|all)$

这为您提供了四种可能性:

  • [1-9] 个位数的值。
  • [1-5][0-9]: 从十点到五十九点。
  • 60:六十。
  • all:您的“全部”选项。

但请记住,正则表达式并不总是每个问题的答案。

有时它们对于复杂的值检查不太有用(尽管在这种情况下,这是一个相当简单的检查)。类似于以下内容(伪代码):

def isAllOrOneThruSixty(str):
    if str == "all":
        return OK
    if str.matches ("[0-9]+"):
        val = str.convertToInt()
        if val >= 1 and val <= 60:
            return OK
    return BAD

有时可能更冗长,但也更易读和可维护。

【讨论】:

    【解决方案2】:

    这将满足您的所有需求

    ^([1-9]|[1-5]\d|60|all)$
    

    【讨论】:

      【解决方案3】:

      您将[1-5] 设为可选;把它转过来,像这样:[1-5][0-9]?。另外你需要覆盖个位数的[6-9]

      【讨论】:

      • @Daniel Hilgarth:您可能已经阅读过早期版本,但在您投反对票之前,我肯定已经编辑了该版本。你的争论不再正确;你能删除否决票吗?谢谢。
      • 我会,如果可以的话,虽然我不同意你的回答。但是,自投反对票以来已经过去了太多时间。顺便说一句:显然,在我投反对票之前,您没有编辑您的问题。查看对我的评论的支持。
      【解决方案4】:

      问题是你缺少一些括号,你应该切换 60 和其余的,否则它只会匹配 60 中的 6:

      ^((60|([1-5]?[0-9]))|all)
      

      【讨论】:

        猜你喜欢
        • 2023-01-10
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多