正则表达式无法解析0-23之间的数字

时间:2014-10-16 16:29:29

标签: javascript regex

为什么这个js正则表达式无法解析0-23之间的数字?

pattern = /([0-1]?[0-9]|2[0-3])/
"12".match(pattern) // => matches 12
"23".match(pattern) // => matches 2 (expected 23)

4 个答案:

答案 0 :(得分:5)

正则表达式返回第一个匹配项。 [0-1]?[0-9]匹配2

要获得所需内容,您需要调整模式的顺序:

var pattern = /2[0-3]|[0-1]?[0-9]/;



var pattern = /2[0-3]|[0-1]?[0-9]/;
document.write("12".match(pattern));
document.write('<br/>');
document.write("23".match(pattern));
&#13;
&#13;
&#13;

<强>更新

以上将匹配234返回23。如果您不想与之匹配,可以使用字边界\b^$锚点,如Gergo Erdosi建议:

var pattern = /\b2[0-3]\b|\b[0-1]?[0-9]\b/;

var pattern = /\b(2[0-3]|[0-1]?[0-9])\b/;

答案 1 :(得分:2)

  

为什么这个js正则表达式无法解析0-23之间的数字?

因为正则表达式中的第一个模式将始终尝试匹配输入字符串(即|之前的模式)。如果它找到匹配,则它不会去寻找下一个模式(即|之后的模式)。您的第一个模式与2匹配,因此无法进入下一个模式。

如果颠倒模式的顺序,它会起作用。

最好在验证输入字符串时使用开始和结束锚点。

> var pattern = /^([0-1]?[0-9]|2[0-3])$/g;
undefined
> "12".match(pattern)
[ '12' ]
> "23".match(pattern)
[ '23' ]

答案 2 :(得分:1)

确保正则表达式匹配完整字符串:

pattern = /^([0-1]?[0-9]|2[0-3])$/

答案 3 :(得分:1)

你非常接近。尝试这样的事情:

pattern = /^([0-1]?[0-9]|2[0-3])$/

您的表达式当前与表达式的第一部分匹配,然后才能评估后半部分。有几种方法可以处理,但匹配输入的全长可能是最简单的。