你對+
和*
的含義是正確的。所以\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