我一直在阅读JavaScript: The Good Parts 道格拉斯克罗克福德。在关于正则表达式的部分中,有以下正则表达式来解析数字:
var parse_number = /^-?\d+(?:\.\d*)?(?:e[+\-]?\d+)?$/i;
这个正则表达式非常简单,Crockford将其分解,以便几乎每个方面都非常清晰。但是,有一个方面没有完全解释,我无法弄清楚:
(?:\.\d*)?
他的解释,我明白,是:
(?:... )?
表示可选的非捕获组...该组将 匹配小数点后跟零或更多位数。
让我困惑的部分,以及未解释的部分是 零或更多数字而不是一个或多个数字,即,为什么在这种情况下使用\d*
而不是\d+
?我通过.test
确认的直觉是,上面描述的parse_number
模式不仅匹配像'1.0'
这样的字符串 - 你可能想要匹配 - 但也匹配字符串像'1.'
一样有一个尾随的小数,我想不出一个用例。
我认为有一个很好的理由可以使用:
(?:\.\d*)?
而不是:
(?:\.\d+)?
但这可能是什么原因?
答案 0 :(得分:4)
匹配JavaScript NumericLiteral syntax production,后者允许在其后面没有数字的尾随.
。它在这里被称为:
DecimalLiteral ::
DecimalIntegerLiteral
.
DecimalDigits opt ExponentPart opt
请注意, DecimalDigits 和 ExponentPart 的选择权如何。
这是完全有效的JavaScript:
var a = 42.;
// -------^
console.log(a); // 42