为什么[01-12]范围不按预期工作?

时间:2010-06-30 10:14:29

标签: regex

我正在尝试使用正则表达式中的范围模式[01-12]来匹配两位数mm,但这不会按预期工作。

8 个答案:

答案 0 :(得分:162)

您似乎误解了字符类定义在正则表达式中的工作原理。

匹配任何字符串010203040506070809101112,这样的工作原理:

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

参考


解释

字符类本身会尝试匹配输入字符串中的一个字符。 [01-12]实际上定义了[012],这是一个字符类,它将输入中的一个字符与3个字符012中的任何一个匹配。

-范围定义从1变为1,其中仅包含1。另一方面,[1-9]之类的内容包括123456,{ {1}},78

初学者经常犯定义9之类的错误。这不“有用”。此字符定义定义[this|that],即它将输入中的一个字符与[this|a]thi,{{中的6个字符中的任何一个匹配1}}或s。很可能|是预期的。

参考


如何定义范围

现在很明显,像a这样的模式“不起作用”。在这种情况下,字符类相当于(this|that)

即,字符类定义中的between [24-48] hours未定义模式中的数值范围。正则表达式引擎并不真正“理解”模式中的数字,但有限重复语法除外(例如[248]匹配3到5 -)。

范围定义使用字符的ASCII / Unicode编码来定义范围。字符a{3,5}以ASCII为单位编码为48; a为57.因此,字符定义0包括编码中值为十进制48和57之间的所有字符。相当明智,通过设计,这些是9[0-9],......,0

另见


另一个例子:A到Z

让我们看看另一个常见的字符类定义1

在ASCII中:

  • 9 = 65,[a-zA-Z] = 90
  • A = 97,Z = 122

这意味着:

  • az相同
  • 在大多数情况下,[a-zA-Z]可能是非法的角色范围
    • 因为[A-Za-z](97)“大于”而不是[a-Z](90)
  • a合法,但也包含以下六个字符:
    • Z(91),[A-z](92),[(93),\(94),](95),`` `(96)

相关问题

答案 1 :(得分:22)

正则表达式中的字符类(由[...]语法表示,指定在输入中匹配单个字符的规则。因此,您在括号中编写的所有内容都指定了如何匹配单个字符

您的模式[01-12]因此细分如下:

  • 0 - 匹配单个数字0
  • 或1-1匹配1到1
  • 范围内的单个数字
  • 或,2,匹配单个数字2

所以你基本上所有匹配的都是0,1或2.

为了进行你想要的匹配,匹配两个数字,范围从01-12作为数字,你需要考虑它们看起来如何作为文本。

你有:

  • 01-09(即第一个数字是0,第二个数字是1-9)
  • 10-12(即第一个数字是1,第二个数字是0-2)

然后你必须为它写一个正则表达式,如下所示:

  +-- a 0 followed by 1-9
  |
  |      +-- a 1 followed by 0-2
  |      |
<-+--> <-+-->
0[1-9]|1[0-2]
      ^
      |
      +-- vertical bar, this roughly means "OR" in this context

请注意,尝试将它们组合以获得更短的表达式将失败,方法是为无效输入提供误报匹配。

例如,模式[0-1][0-9]基本上匹配数字00-19,这比您想要的更多。

我尝试找到关于角色类的更多信息的明确来源,但是现在我可以给你的是Google Query for Regex Character Classes。希望您能够在那里找到更多信息来帮助您。

答案 2 :(得分:7)

这也有效:

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

[1-9]匹配1到9之间的单个数字

[0-1][0-2]匹配10到12之间的两位数

有一些很好的例子here

答案 3 :(得分:1)

由于字符类([]中的内容)匹配字符而不是字符串,因此polygenelubricants表示你会寻找0 | 1-1 | 2而不是你想要的东西。

答案 4 :(得分:1)

正则表达式中的[]表示字符类。如果未指定范围,则隐式将其中的每个字符组合在一起。因此,[abcde](a|b|c|d|e)相同,只是它没有捕获任何内容;它将匹配abcde中的任何一个。所有范围都表示一组字符; [ac-eg]说“匹配以下任意一个:a; ce之间的任何字符;或g”。因此,您的匹配说“匹配以下任意一个:0; 11之间的任何字符(,只是1);或者2

您的目标显然是指定一个数字范围:0112之间用两位数字写的任何数字。在这种特定情况下,您可以将其与0[1-9]|1[0-2]匹配:0后跟19之间的任意数字,或1后跟任何数字02之间的数字。通常,您可以以类似的方式将任意数字范围转换为有效的正则表达式。但是,可能有比正则表达式更好的选项,或者可以为您构造正则表达式的现有函数或模块。这取决于你的语言。

答案 5 :(得分:0)

使用此:

$(document).ready(function(){
    function adjustJumboHeight(){
       ... your code

       // add following three lines
       $.get('<URL>', function(data) {
          $('#remainder').html(data);
       });
}
  • 07:有效
  • 7:有效
  • 0:不匹配
  • 00:不匹配
  • 13:不匹配
  • 21:不匹配

要将模式测试为07/2018,请使用:

0?[1-9]|1[012]

(日期范围在01/2000到129999之间)

答案 6 :(得分:0)

我保持 mm-yyyy 的解决方案是 ^0*([1-9]|1[0-2])-(20[2-4][0-9])$

答案 7 :(得分:-3)

要解决此问题,您可以使用/^[0-1][0-9]$/; 如果您只想0112,则需要检查以下两个条件:

00是否使用if语句:

if(thevale=="00")
{
    // message to user...not allowed
}

if(thevalue >=13)
{
    // message to user...not allowed
}

Javascript中的示例代码:

function CheckMonth(txtBox) {        
        var ex = /^[0-1][0-9]$/;
        if (txtBox.value.trim() != "") {
            if (txtBox.value.trim() == "00") {
                alert('Please enter valid numbers.');
                txtBox.value = "";
                txtBox.focus();
            }
            else if (ex.test(txtBox.value.trim()) == false) {
                alert('Please enter valid numbers.');
                txtBox.value = "";
                txtBox.focus();
            }
            else if (parseInt(txtBox.value.trim()) >= 13) {
                alert('Please enter valid numbers.');
                txtBox.value = "";
                txtBox.focus();
            }
        }
    }