为什么这个js正则表达式无法解析0-23之间的数字?
pattern = /([0-1]?[0-9]|2[0-3])/
"12".match(pattern) // => matches 12
"23".match(pattern) // => matches 2 (expected 23)
答案 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;
<强>更新强>
以上将匹配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])$/
您的表达式当前与表达式的第一部分匹配,然后才能评估后半部分。有几种方法可以处理,但匹配输入的全长可能是最简单的。