有人可以帮助我理解为什么使用 \d* 返回一个包含空字符串的数组,而使用 \d+ 返回 ["100"] (如预期的那样)。我明白为什么 \d+ 有效,但不明白为什么 \d* 无效。使用 * 是否会导致它返回零长度匹配,这究竟是如何工作的?
var str = 'one to 100';
var regex = /\d*/;
console.log(str.match(regex));
// [""]
有人可以帮助我理解为什么使用 \d* 返回一个包含空字符串的数组,而使用 \d+ 返回 ["100"] (如预期的那样)。我明白为什么 \d+ 有效,但不明白为什么 \d* 无效。使用 * 是否会导致它返回零长度匹配,这究竟是如何工作的?
var str = 'one to 100';
var regex = /\d*/;
console.log(str.match(regex));
// [""]
请记住,match
它正在寻找它可以找到的与给定正则表达式匹配的第一个子字符串。
*
意味着可能有零个或多个,因此\d*
意味着您正在寻找包含零个或多个数字的字符串。
如果您的输入字符串以数字开头,则将匹配整个数字。
"5 to 100".match(/\d*/); // "5"
"5 to 100".match(/\d+/); // "5"
但是由于第一个字符是非数字,因此match()
表示字符串的开头(没有字符)与正则表达式匹配。
由于您的字符串不以任何数字开头,因此空字符串是与该正则表达式匹配的输入的第一个子字符串。
/\d*/
表示“匹配从字符串开头开始的 0 个或多个数字”。
当您开始字符串的开头时,它会立即遇到一个非数字并且不能再进一步了。然而,这被认为是成功的匹配,因为“0 或更多”。
您可以通过以下方式尝试“1个或多个”
/\d+/
或者您可以告诉它匹配字符串末尾的“0 或更多”:
/\d*$/
在 Python 中,有一种findall()
方法可以返回与正则表达式匹配的字符串的所有部分。
re.findall(r'\d*', 'one to 100')
# => ['', '', '', '', '', '', '', '100', '']
.match()
在 JavaScript 中,只返回第一个匹配项,这将是上述数组中的第一个元素。
*
意味着 0 或更多,所以它匹配 0 次。您需要使用+
1 个或多个。默认情况下它是贪婪的,所以会匹配100
:
var str = 'one to 100';
var regex = /\d+/;
console.log(str.match(regex));
// ["100"]
正如@StriplingWarrior 在下面所说的,空字符串是第一个匹配项,因此它被返回。我想补充一点,您可以通过注意函数match
返回的“索引”字段来判断正则表达式匹配的是什么。例如,这就是我在 Chrome 中运行您的代码时得到的结果:
["", index: 0, input: "one to 100"]