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