+
您对和的含义是正确的*
。所以\d*
将匹配零个或多个数字——这正是它正在做的事情。从字符串的开头开始,它匹配零位数字,然后就完成了。它成功匹配零个或多个数字。
*
是贪心的,但这仅意味着它将在匹配的位置匹配尽可能多的数字。它不会放弃匹配来尝试在字符串中稍后找到更长的匹配。
编辑:更详细的描述正则表达式引擎的作用:
以我们要搜索的字符串为"http://www.domain.com/7464535"
且模式为的情况为例\d+
。
一开始,正则表达式引擎指向我们 URL 的开头和正则表达式模式的开头。\d+
需要匹配一个或多个数字,所以首先正则表达式引擎必须找到至少一个数字才能成功匹配。
它看起来的第一个地方找到了一个“h”字符。那不是数字,所以它移动到“t”,然后是下一个“t”,依此类推,直到最终到达“7”。现在我们已经匹配了一个数字,所以“一个或多个”的要求得到了满足,我们可以成功匹配,除了+
贪心,它会匹配尽可能多的数字而不改变匹配的起点,' 7'。所以它到达字符串的末尾并匹配整数'7464535'。
现在考虑我们的模式是否是\d*
. 现在唯一的区别是零位是有效匹配。由于正则表达式从左到右匹配,因此第一个\d*
匹配的位置是字符串的开头。所以我们在开始时有一个零长度匹配,但由于*
是贪心的,只要有数字,它就会扩展匹配。由于我们找到的第一件事是'h',一个非数字,它只返回零长度匹配。
那么*
,如果它只会给你一个零长度的匹配,那么它还有什么用呢?考虑一下我是否匹配这样的配置文件:
foo: bar
baz: quux
blah:blah
I want to allow any amount of spaces (even zero) after the colon. I would use a regex like (\w+):\s*(\w+)
where \s*
matches zero or more spaces. Since it occurs after the colon in the pattern, it will match just after the colon in the string and then either match a zero-length string (as in the third line blah:blah
because the 'b' after the colon ends the match) or all the spaces there are before the next non-space, because *
is greedy.