为什么String.match(/ \ d * /)返回一个空字符串?

时间:2015-05-20 21:11:45

标签: javascript regex

有人可以帮助我理解为什么使用\ d *返回一个包含空字符串的数组,而使用\ d +返回[" 100"](如预期的那样)。我明白为什么\ d +有效,但不知道为什么\ d *不起作用。是否使用*使它返回一个零长度匹配,以及它是如何工作的?

var str = 'one to 100';
var regex = /\d*/;
console.log(str.match(regex));
// [""]

4 个答案:

答案 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中查找全部

在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