*和+在正则表达式中表现不同

时间:2017-10-08 05:45:09

标签: javascript regex

"ange134".match(/\d+/)       // result =>  134
"ange134".match(/\d*/)       // result =>  ""     //expected 134

在上述情况下,+表现得很好,因为贪婪。

但为什么/\d*/没有返回相同的东西?

3 个答案:

答案 0 :(得分:6)

"ange134".match(/\d+/)       // result =>  123

在上面的情况下\d+确保必须至少有一个数字可以跟随更多,因此当扫描开始并且它在开头找到“a”时它仍然继续搜索数字不符合条件。

"ange134".match(/\d*/)       // result =>  ""     //expected 123

但在上述情况下,\d*表示或更多数字出现。因此,当扫描开始并且当它找到“a”时,条件得到满足(数字为零)...因此,您将获得空结果集。

您可以设置全局标记/g以使其继续搜索所有结果。请参阅此link以了解行为如何随全局标志发生变化。尝试打开和关闭它以更好地理解它。

console.log("ange134".match(/\d*/));
console.log("ange134".match(/\d*$/));
console.log("ange134".match(/\d*/g));
console.log("134ange".match(/\d*/));   // this will return 134 as that is the first match that it gets

答案 1 :(得分:0)

"ange134".match(/\d*/);

表示“匹配数字字符0次或更多次”。正如Ryan在上面指出的那样,空字符串满足这个正则表达式。尝试:

"ange134".match(/\d*$/);

你可以看到它确实有效 - 如果您的目标是匹配该字符串的 134 部分,则需要一些上下文。

答案 2 :(得分:0)

"ange134".match(/\d*/) //means 0 or more times, and this match in the first
//letter (because it "returns false") because you aren't using global flag that search in the whole string

如果你想让它工作,那么使用全局标志:

"ange134".match(/\d*/g)

或使用没有标志的第一个正确选项:

"ange134".match(/\d+/)

在这个链接中有一个解释为什么它匹配第一个" a"信:https://regex101.com/r/3ItllY/1/