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
,1
或2
.
该-
范围定义从去1
到1
,其中包括刚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-zA-Z]
在ASCII中:
A
= 65,Z
= 90a
= 97,z
= 122这意味着:
[a-zA-Z]
并且[A-Za-z]
是等价的[a-Z]
很可能是非法的角色范围
a
(97)"大于"而不是Z
(90)[A-z]
是合法的,但也包括这六个字符:
[
(91),\
(92),]
(93),^
(94),_
(95),```(96)ang*_*son 22
正则表达式中的字符类(由[...]
语法表示)指定与输入中的单个字符匹配的规则.因此,您在括号中编写的所有内容都指定了如何匹配单个字符.
[01-12]
因此,您的模式细分如下:
所以你基本上所有匹配的都是0,1或2.
为了进行你想要的匹配,匹配两个数字,范围从01-12作为数字,你需要考虑它们将如何看作文本.
你有:
然后,您必须为其编写正则表达式,如下所示:
+-- 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.希望您能够在那里找到更多信息来帮助您.
这也有效:
^([1-9]|[0-1][0-2])$
[1-9]
匹配1到9之间的单个数字
[0-1][0-2]
匹配10到12之间的两位数
有一些很好的例子在这里