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

DEA*_*NET 82 regex

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

pol*_*nts 179

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

为了匹配任何字符串01,02,03,04,05,06,07,08,09,10,11,或者12,像这样的工作:

0[1-9]|1[0-2]
Run Code Online (Sandbox Code Playgroud)

参考


说明

字符类本身会尝试匹配输入字符串中的一个和一个字符.[01-12]实际上定义[012],即从输入的一个字符的针对任何3个字符相匹配的字符类0,12.

-范围定义从去11,其中包括刚1.在另一方面,像[1-9]包括1,2,3,4,5,6,7,8,9.

初学者经常犯错误的定义[this|that].这不"有用".此字符定义定义[this|a],即,它从对任何的6个字符的输入的一个字符匹配中t,h,i,s,|a.更有可能(this|that)是预期的.

参考


如何定义范围

所以现在显而易见的是,模式between [24-48] hours不会"起作用".在这种情况下,字符类相当于[248].

也就是说,-在字符类定义中没有定义模式中的数值范围.除了有限重复语法(例如a{3,5}3到5之间的匹配a)之外,正则表达式引擎并不真正"理解"模式中的数字.

范围定义使用字符的ASCII/Unicode编码来定义范围.字符0以ASCII编码为十进制48; 9因此,字符定义[0-9]包括编码中其值在十进制48和57之间的所有字符.而是理智,在设计这些人物0,1..., 9.

也可以看看


另一个例子:A到Z.

我们来看看另一个常见的字符类定义 [a-zA-Z]

在ASCII中:

  • A= 65,Z= 90
  • a= 97,z= 122

这意味着:

  • [a-zA-Z]并且[A-Za-z]是等价的
  • 在大多数口味中,[a-Z]很可能是非法的角色范围
    • 因为a(97)"大于"而不是Z(90)
  • [A-z] 是合法的,但也包括这六个字符:
    • [(91),\(92),](93),^(94),_(95),```(96)

相关问题

  • __重要的是要注意:__如果你发现这个页面想要一个数字范围的解决方案,在到达十位之前只有一位数,那么`0 [1-9] | 1 [0-2]`将不起作用.将其更改为合乎逻辑的下一步`[1-9] | 1 [0-2]`由于可理解的原因不起作用(它仅匹配`10`,'11`和`12`中的`1` ).不得不使用`\ b(?:[0-9] | 1 [0-1])\ b`来防止这种情况发生.`\ b`确保正则表达式匹配单词(或在本例中为数字)边界(`^`&```没有); 括号使or(```)考虑到它的另一面; 最后`?:`是不使用括号创建子匹配. (2认同)

ang*_*son 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
Run Code Online (Sandbox Code Playgroud)

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

例如,模式[0-1][0-9]基本上匹配数字00-19,这比你想要的多一点.

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


cod*_*ger 9

这也有效:

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

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

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

有一些很好的例子在这里

  • 确切地说,`[0-1] [0-2]`也匹配'00`.也就是说,链接+1(我在答案中使用过). (2认同)
  • 必须仔细解释[0-1] [0-2]`,因为它允许使用`00`,`01`和`02`之类的字符串,但不允许使用`03`直至`09`,最终接受“ 10”,“ 11”和“ 12”。正确的正则表达式是[[1-9] | 1 [0-2]],甚至是0 *([1-9] | 1 [0-2])(最后一个允许任意数量的前导零) )。 (2认同)