JavaScript正则表达式:为什么匹配数字与尾随小数?

时间:2017-01-17 15:49:36

标签: javascript regex

我一直在阅读JavaScript: The Good Parts 道格拉斯克罗克福德。在关于正则表达式的部分中,有以下正则表达式来解析数字:

var parse_number = /^-?\d+(?:\.\d*)?(?:e[+\-]?\d+)?$/i;

这个正则表达式非常简单,Crockford将其分解,以便几乎每个方面都非常清晰。但是,有一个方面没有完全解释,我无法弄清楚:

(?:\.\d*)?

他的解释,我明白,是:

  

(?:... )?表示可选的非捕获组...该组将   匹配小数点后跟零或更多位数。

让我困惑的部分,以及未解释的部分是 零或更多数字而不是一个或多个数字,即,为什么在这种情况下使用\d*而不是\d+?我通过.test确认的直觉是,上面描述的parse_number模式不仅匹配像'1.0'这样的字符串 - 你可能想要匹配 - 但也匹配字符串像'1.'一样有一个尾随的小数,我想不出一个用例。

我认为有一个很好的理由可以使用:

(?:\.\d*)?

而不是:

(?:\.\d+)?

但这可能是什么原因?

1 个答案:

答案 0 :(得分:4)

匹配JavaScript NumericLiteral syntax production,后者允许在其后面没有数字的尾随.。它在这里被称为:

  

DecimalLiteral ::

     

DecimalIntegerLiteral . DecimalDigits opt ExponentPart opt

请注意, DecimalDigits ExponentPart 的选择权如何。

这是完全有效的JavaScript:

var a = 42.;
// -------^
console.log(a); // 42