【问题标题】:How to represent regex number ranges (e.g. 1 to 12)?如何表示正则表达式数字范围(例如 1 到 12)?
【发布时间】:2011-08-18 09:23:19
【问题描述】:

我目前使用([1-9]|1[0-2]) 表示从 1 到 12 的输入。(不允许前导零。)

然而,它看起来相当 hacky,而且在某些日子里它看起来 完全肮脏

☞ 有没有一种正确的内置方法可以做到这一点?

☞ 表示数字范围的其他方式有哪些?

【问题讨论】:

  • 如果“越大越好”,那么 (1|2|3|4|5|6|7|8|9|10|11|12) 会更好。
  • 您需要用锚点包裹表达式,否则您将匹配错误值的第一个数字,例如1234。像这样:^([1-9]|1[0-2])$ 或可能:\b([1-9]|1[0-2])\b 会更好。

标签: regex coding-style standards


【解决方案1】:

我倾向于使用[2-9]|1[0-2]? 之类的形式,这样可以避免回溯,尽管在这里没什么区别。我受 XML Schema 的约束以避免这种“歧义”,尽管 regex 可以很好地处理它们。

【讨论】:

  • 基本上,当匹配器看到一个“1”字符时,“含义”是模棱两可的,直到它看到更多的字符。是 [1-9] 的“1”还是 1[0-2] 的“1”?正则表达式不关心含义,但有时它仍然是一个效率问题,因为匹配器必须保持两个分支都处于活动状态,直到歧义得到解决。
  • 所以你说在正则表达式机器眼中这是最快的解决方案:1|2|3|4|5|6|7|8|9|10|11|12 ?
  • 不,我没有比较 [2-9]2|3|4|5|6|7|8|9 -- 不知道哪个更快。我将1|1010? 进行比较。并不是说这样一个微不足道的例子会成为问题,而是对于更多涉及的正则表达式,这将有助于删除分支的常见前缀。也许是一个更好的例子:ab|ac 改进为 a(b|c)
  • 在我的例子中,10以下的数字应该有一个前导零,所以我将模式更改为0[1-9]|1[0-2]?
  • ? 这个表达式也接受像 123 这样的数字,你可以在这里测试它regexr.com/5hjpc,想法是只测试从 1 到 12 的数字,不多不少
【解决方案2】:

是的,正确的:

[1-9]|1[0-2]

否则你不会得到 10。

【讨论】:

  • 这将接受任何没有 0 的数字。
【解决方案3】:

这是更好的答案,从 1 到 12 完全匹配。

(^0?[1-9]$)|(^1[0-2]$)

以前的答案并不适用于 HTML 输入正则表达式验证,其中某些值(如 '1111' 或 '1212' 仍将其视为有效输入。

【讨论】:

    【解决方案4】:

    ​​​​ 您可以使用:

    [1-9]|1[012]
    

    【讨论】:

      【解决方案5】:

      怎么样:

      ^[1-9]|10|11|12$
      

      匹配 0-9 或 10 或 11 或 12。仅此而已,没有其他匹配项。

      【讨论】:

        【解决方案6】:

        你可以试试这个:

        ^[1-9]$|^[1][0-2]$
        

        【讨论】:

          【解决方案7】:

          使用以下模式 (0?[1-9]|1[0-2]) 使用它将返回从 112一月到十二月)的值,即使它最初是以 0 开头 (01, 02, 03, ..., 09, 10, 11, 12)

          【讨论】:

            【解决方案8】:

            验证从 1 到 12 的数字的正确模式如下:

            (^[1-9][0-2]$)|(^[1-9]$)
            

            例如,当您输入类型为 number 并且需要验证月份时,上述表达式很有用。这是因为输入类型数字忽略了任何数字前面的 0,例如:01 它返回 1。

            你可以在这里看到它的实际效果:https://regexr.com/5hk0s

            如果您需要验证字符串数字,我的意思是,当您使用带有文本类型的输入但您期望数字时,例如:到期卡月份或月份,以下表达式可能对您有用:

            ((^0[1-9]$)|(^1[0-2]$))
            

            您可以在此处查看它的运行情况https://regexr.com/5hkae

            我希望这会有所帮助,因为它非常棘手。

            问候。

            【讨论】:

              【解决方案9】:

              python 中,它匹配 1 - 12 之间的任何数字

              12|11|10|9|8|7|6|5|4|3|2|1
              

              降序很重要。按升序 101112 将匹配 1,因为正则表达式通常选择 第一个匹配项价值

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-05-29
                • 2011-04-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多