为什么范围没有按预期工作?
我正在尝试使用正则expression式中的范围模式[01-12]
来匹配两位数的mm,但是这并不像预期的那样工作。
您好像误解了字符类定义在正则expression式中的作用。
要匹配任何string01
或12
,类似这样的工作:
0[1-9]|1[0-2]
参考
- regular-expressions.info/Character Classes
- 数字范围 (在匹配string上有很多例子,解释为数字范围)
说明
一个字符类本身试图匹配inputstring中的一个字符和一个字符。 [01-12]
实际上定义了[012]
,一个字符类,匹配input中的一个字符与3个字符0
或2
中的任何一个字符。
范围定义从1
到1
,其中只包括1
。 另一方面,例如[1-9]
包括1
。
初学者经常会犯这样的错误,比如[this|that]
。 这不“工作”。 这个字符定义定义了[this|a]
,也就是说它匹配input中的一个字符与t
, h
, i
, s
, |
的6个字符中的任何一个|
或者a
。 更可能(this|that)
是什么意图。
参考
- regular-expressions.info/Brackets 与垂直条 分组和交替
如何定义范围
所以现在很明显,像between [24-48] hours
的模式不“工作”。 这种情况下的字符类相当于[248]
。
也就是说, -
在一个字符类定义中没有定义模式中的数字范围。 正则expression式引擎并不真正“理解”模式中的数字,除了有限重复语法(例如3和5之间a{3,5}
匹配)之外。
范围定义使用字符的ASCII / Unicode编码来定义范围。 字符0
在ASCII中被编码为十进制48; 9
是57.因此,字符定义[0-9]
包括编码中值在小数点48和57之间的所有字符。 相当明智地,通过devise,这些是字符0
,…, 9
。
也可以看看
- 维基百科/ ASCII
又如:A到Z
我们来看看另一个常见的字符类定义[a-zA-Z]
在ASCII中:
-
A
= 65,Z
= 90 -
a
= 97,z
= 122
这意味着:
-
[a-zA-Z]
和[A-Za-z]
是等价的 - 在大多数口味中,
[aZ]
可能是非法的字符范围- 因为(97)比
Z
(90)大“
- 因为(97)比
-
[Az]
是合法的,但也包括这六个字符:- (91),(92),(93),(94),(95),(96)
相关问题
- 是正则expression式[aZ]是否有效,如果是,那么是否与[a-zA-Z]相同
正则expression式中的字符类(用语法表示)指定与input中的单个字符相匹配的规则。 因此,括号内的所有内容都指定了如何匹配单个字符 。
你的模式, [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)
然后你将不得不写一个正则expression式,看起来像这样:
+-- 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
请注意,尝试将它们组合起来以获得较短的expression式将会失败,通过给无效input提供错误的肯定匹配。
例如,模式[0-1][0-9]
基本上与00-19的数字相符,这比你想要的要多一点。
我试图find更多关于字符类的更多信息,但是现在我可以给你的是这个Google Query for Regex Character Classes 。 希望你能在这里find更多的信息来帮助你。
这也适用:
^([1-9]|[0-1][0-2])$
[1-9]
在1和9之间匹配单个数字
[0-1][0-2]
在10和12之间匹配两位数
这里有一些很好的例子
由于polygenelubricants说,由于字符类([]中的东西)匹配字符而不是string,因此您将查找0 | 1-1 | 2而不是您想要的。
正则expression式中的[]
s表示一个字符类 。 如果没有指定范围,则隐含地或同时包含其中的每个字符。 因此, [abcde]
与(a|b|c|d|e)
,除了它不捕获任何东西; 它将匹配a
, b
, c
, d
或e
中的任何一个。 所有范围表示是一组字符 ; [ac-eg]
表示“匹配以下任何一个: a
; c
和e
之间的任何字符;或者g
”。 因此,你的匹配说“匹配任何一个: 0
;任何1
和1
之间的字符( 即只有1
);或2
。
您的目标显然是指定一个数字范围:用两位数字写的01
至12
之间的任何数字。 在这个特定的情况下,你可以将它与0[1-9]|1[0-2]
匹配:或者是1
到9
之间的任意数字,或者是0
到2
之间的数字。 一般来说,你可以用类似的方式将任何数字范围转换成有效的正则expression式。 可能比正则expression式有一个更好的select,但是,或者可以为您构build正则expression式的现有函数或模块。 这取决于你的语言。
要解决这个问题,你可以使用/^[0-1][0-9]$/;
如果你只想要01
到12
,你需要检查两个条件:
if
使用if
语句,值是否为00
:
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(); } } }