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.
之后,它是一个完整的产品,因此可以使用
访问属性…:-)