JavaScript正则表达式:为什么要将数字与后面的小数点匹配?
我一直在看书 道格拉斯·克罗克福德。在正则表达式一节中,有以下正则表达式用于解析数字:JavaScript正则表达式:为什么要将数字与后面的小数点匹配?,javascript,regex,Javascript,Regex,我一直在看书 道格拉斯·克罗克福德。在正则表达式一节中,有以下正则表达式用于解析数字: var parse_number = /^-?\d+(?:\.\d*)?(?:e[+\-]?\d+)?$/i; 这个正则表达式一开始非常简单,Crockford对它进行了分解,因此几乎每个方面都非常清楚。然而,有一个方面没有得到充分解释,我无法理解: (?:\.\d*)? 我理解他的解释是: (?:…)?表示可选的非捕获组…该组将 匹配小数点后的零或多个数字 让我感到困惑的部分是,为什么零个或多个数字而不
var parse_number = /^-?\d+(?:\.\d*)?(?:e[+\-]?\d+)?$/i;
这个正则表达式一开始非常简单,Crockford对它进行了分解,因此几乎每个方面都非常清楚。然而,有一个方面没有得到充分解释,我无法理解:
(?:\.\d*)?
我理解他的解释是:
(?:…)?
表示可选的非捕获组…该组将
匹配小数点后的零或多个数字
让我感到困惑的部分是,为什么零个或多个数字而不是一个或多个数字,也就是说,为什么在这种情况下使用\d*
而不是\d+
?我的直觉通过.test
ing得到证实,上面描述的parse_number
模式将不仅匹配像'1.0'
这样的字符串,这可能是您想要匹配的,而且还将像'1.
这样的字符串与尾随的十进制匹配,我想不出它的用例
我认为有一个很好的理由使用:
(?:\.\d*)?
而不是:
(?:\.\d+)?
但原因可能是什么呢?与JavaScript匹配,后者允许后面有一个无数字的
。它在这里被称为:
分位数::
DecimalIntegerLiteral
小数位数选择指数部分选择
请注意,小数位数和指数部分是可选的
这是完全有效的JavaScript:
var a=42。;
// -------^
console.log(a);//42
这是因为45。
也被认为是有效的十进制数感谢您的解释。正则表达式现在对我来说很有意义,因为它符合规范。在这种情况下,JavaScript中的42
和42.
之间有什么区别吗?您的示例代码和我在控制台中的粗略实验似乎表明它们是相同的,但是如果它们是相同的,为什么允许后面的
?这似乎意味着有时您希望使用42.
代替或42
,或者程序可能返回42.
。Python是我最有经验的语言,它也允许42.
(我刚学过),但这可以转化为42.0
;至少不同于Python中的42
。@elethan:根据您是编写42
还是42,结果值没有任何区别。
。我不能说他们为什么允许拖尾
,除了不禁止它更灵活。它确实导致了一个有趣的副作用:您无法编写42.toFixed(2)
,因为解析时它会失败,因为
被视为小数点,但您可以编写42..toFixed(2)
——因为在42.
之后,它是一个完整的产品,因此可以使用
访问属性…:-)