Javascript正则表达式|构造 - 可能的不一致

时间:2011-12-06 19:11:44

标签: javascript regex

也许我不理解某些东西,但有人可以向我解释为什么以下代码的行为方式如下:

/^[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。两种方式都有相同的结果。

3 个答案:

答案 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?