我尝试在正则表达式中使用范围模式 [01-12]
来匹配两位数 mm,但这无法按预期工作。
最佳答案
您似乎误解了正则表达式中字符类定义的工作原理。
匹配任何字符串01
, 02
, 03
, 04
, 05
, 06
, 07
, 08
, 09
, 10
, 11
,或12
,这样的事情有效:
0[1-9]|1[0-2]
引用文献
- regular-expressions.info/Character Classes
- Numeric Ranges (有很多关于将字符串解释为数字范围的匹配示例)
说明
字符类本身会尝试匹配输入字符串中的一个且恰好一个字符。 [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]
,即它将输入中的一个字符与 t
中的 6 个字符中的任何一个进行匹配。 , h
, i
, s
, |
或a
。很有可能(this|that)
这就是我们想要的。
引用文献
<小时/>如何定义范围
所以现在很明显像 between [24-48] hours
这样的模式不“工作”。本例中的字符类相当于 [248]
.
即-
字符类定义中的 不定义模式中的数字范围。正则表达式引擎并不真正“理解”模式中的数字,有限重复语法除外(例如 a{3,5}
匹配 3 到 5 a
)。
范围定义改为使用字符的 ASCII/Unicode 编码来定义范围。角色0
以 ASCII 编码为十进制 48; 9
是 57。因此,字符定义 [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)
-
相关问题
关于regex - 为什么 [01-12] 范围没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3148240/