你对+
和*
的含义是正确的。所以\d*
将匹配零个或多个数字 - 这正是它所做的。从字符串的开始处开始,它匹配零个数字,然后完成。它成功匹配零个或多个数字。
*
是贪婪的,但这只意味着它会匹配尽可能多的数字,因为它可以匹配的地方。它不会放弃一场比赛,试图在比赛中找到更长的比赛。
编辑:的正则表达式引擎所做的更详细的描述:
就拿情况下我们要搜索的字符串是"http://www.domain.com/7464535"
和模式\d+
。
在开始,正则表达式引擎指向我们的URL的开始和正则表达式模式的开始。 \d+
需要匹配一个或多个数字,所以首先正则表达式引擎必须找到至少一个数字才能成功匹配。
它看起来第一个地方找到了'h'字符。这不是一个数字,所以它移动到't',然后是't',等到最后达到'7'时。现在我们已经匹配了一个数字,所以“一个或多个”的要求得到满足,我们可能有一个成功的匹配,除了+
是贪婪的,所以它会匹配尽可能多的数字,因为它可以不改变的起始点比赛,'7'。所以它击中字符串的末尾并匹配整个数字'7464535'。
现在考虑我们的模式是\d*
。现在唯一的区别是零位是有效的匹配。由于正则表达式匹配从左到右,\d*
匹配的第一个位置是字符串的起始位置。所以我们在开始时有一个零长度匹配,但由于*
是贪婪的,只要有数字就会延长匹配。由于我们发现的第一件事是'h',一个非数字,它只是返回零长度匹配。
*
如何更有用,那么,如果它只会给你一个零长度的匹配?试想,如果我是匹配的配置文件是这样的:
foo: bar
baz: quux
blah:blah
我想允许在冒号后面的空格的数量(甚至为零)。我会使用(\w+):\s*(\w+)
这样的正则表达式,其中\s*
匹配零个或多个空格。由于它出现在模式中的冒号后面,它将匹配紧跟在字符串中的冒号,然后匹配一个零长度字符串(如第三行blah:blah
,因为冒号结束匹配后的'b')或全部在下一个非空格之前有空格,因为*
是贪婪的。
对不起,我猜我还是不明白。你说它会“尽量在匹配的地方匹配尽可能多的数字”,但显然它可以在搜索字符串的相同位置匹配更多的数字是正确的?通过行为,我看到为什么会有人使用'*'?难道它不会总是返回一个空字符串,因为它总是匹配0个字符吗? – asolberg
我添加了一个更详细的描述,发生了什么事情,我希望它有帮助! –
伟大我想我现在明白了这是非常有用的谢谢。 – asolberg