也许我不理解某些东西,但有人可以向我解释为什么以下代码的行为方式如下:
/^[1-9]\d*(\.\d{2})?$/.test('0.50') === false;
/^\.\d+$/.test('0.50') === false;
/^([1-9]\d*(\.\d{2})?)|(\.\d+)$/.test('0.50') === true; // <-- WTF?
这里发生了什么?如您所见,第3个表达式由|
运算符连接的前两个表达式组成。由于每个测试false
,不是false | false == false
?或者我错过了正则表达式的基本概念?
我在浏览器中尝试过这个,并使用nodejs。两种方式都有相同的结果。
答案 0 :(得分:2)
这是因为运营商的优先权。
您的表达式为^[1-9][0-9]*(\.\d{2})?
或\.\d+$
。
如果您执行以下操作:
/^([1-9][0-9]*(\.\d{2})?)$|^(\.\d+)$/.test('0.50')
你会得到false
的预期。
(请注意边界处额外的$和^。)
更多详细信息:在最后一个表达式的第二部分中,您不再需要.
作为第一个字符。
答案 1 :(得分:0)
当您使用这样的替换时,您还必须将不同的组括在()
/^(?:([1-9][0-9]*(\.\d{2})?)|(\.\d+))$/
否则你的正则表达式表现完全不同。
答案 2 :(得分:0)
是的,但这不是假的假。我将添加一些括号,以明确第三个正则表达式评估的内容:
/(^([1-9]\d*(\.\d{2})?))|((\.\d+)$)/.test('0.50') === true; // <-- WTF?