我正在尝试使用正则表达式中的范围模式[01-12]
来匹配两位数mm,但这不会按预期工作。
答案 0 :(得分:162)
您似乎误解了字符类定义在正则表达式中的工作原理。
匹配任何字符串01
,02
,03
,04
,05
,06
,07
,08
,09
,10
,11
或12
,这样的工作原理:
0[1-9]|1[0-2]
字符类本身会尝试匹配输入字符串中的一个字符。 [01-12]
实际上定义了[012]
,这是一个字符类,它将输入中的一个字符与3个字符0
,1
或2
中的任何一个匹配。
-
范围定义从1
变为1
,其中仅包含1
。另一方面,[1-9]
之类的内容包括1
,2
,3
,4
,5
,6
,{ {1}},7
,8
。
初学者经常犯定义9
之类的错误。这不“有用”。此字符定义定义[this|that]
,即它将输入中的一个字符与[this|a]
,t
,h
,i
,{{中的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
。
让我们看看另一个常见的字符类定义1
在ASCII中:
9
= 65,[a-zA-Z]
= 90 A
= 97,Z
= 122 这意味着:
a
和z
相同[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,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
请注意,尝试将它们组合以获得更短的表达式将失败,方法是为无效输入提供误报匹配。
例如,模式[0-1][0-9]
基本上匹配数字00-19,这比您想要的更多。
我尝试找到关于角色类的更多信息的明确来源,但是现在我可以给你的是Google Query for Regex Character Classes。希望您能够在那里找到更多信息来帮助您。
答案 2 :(得分:7)
答案 3 :(得分:1)
由于字符类([]中的内容)匹配字符而不是字符串,因此polygenelubricants表示你会寻找0 | 1-1 | 2而不是你想要的东西。
答案 4 :(得分:1)
正则表达式中的[]
表示字符类。如果未指定范围,则隐式或将其中的每个字符组合在一起。因此,[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]
匹配:0
后跟1
和9
之间的任意数字,或1
后跟任何数字0
和2
之间的数字。通常,您可以以类似的方式将任意数字范围转换为有效的正则表达式。但是,可能有比正则表达式更好的选项,或者可以为您构造正则表达式的现有函数或模块。这取决于你的语言。
答案 5 :(得分:0)
使用此:
$(document).ready(function(){
function adjustJumboHeight(){
... your code
// add following three lines
$.get('<URL>', function(data) {
$('#remainder').html(data);
});
}
要将模式测试为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]$/;
如果您只想01
到12
,则需要检查以下两个条件:
值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();
}
}
}