也许我不理解某些东西,但有人可以向我解释为什么以下代码的行为方式是这样的:
/^[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?
这是怎么回事?如您所见,第三个表达式由 |
运算符连接的前两个表达式组成。由于每个测试都是 false
,所以不是 false |假==假
?还是我缺少正则表达式的基本概念?
我已经在浏览器和 nodejs 中试过了。无论哪种方式,结果都是一样的。
最佳答案
这是因为运算符的优先级。
您的表达式是 ^[1-9][0-9]*(\.\d{2})?
或 \.\d+$
。
如果您执行以下操作:
/^([1-9][0-9]*(\.\d{2})?)$|^(\.\d+)$/.test('0.50')
如您所愿,您将得到 false
。
(注意边界处额外的 $ 和 ^)。
更多细节:在最后一个表达式的第二部分中,您不再需要 .
作为第一个字符。
关于Javascript 正则表达式 |构造 - 可能的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8405412/