2013-11-27 44 views
1

在正則表達式中,(\w+)?(\w*)之間有什麼區別嗎? 我不明白是否有一些我失蹤的東西。我已經使用了不同的代碼,但他們似乎做了完全相同的事情。 它基本上是一樣的,對吧?是( w +)?和( w *)一樣嗎?

+0

[regex:plus sign vs asterisk]可能的重複(http://stackoverflow.com/questions/18364673/regex-plus-sign-vs-asterisk) – PeeHaa

回答

7
  • 在他們所匹配的方面,有(\w+)?(\w*)沒有區別。它們都匹配0次或多次出現\w。這也可以通過使用Perl的Regexp-Compare模塊運行測試來測試,該模塊產生了預期的結果。

  • 捕獲組而言,有一個很大的區別。在(\w+)?的情況下,如果失敗,則捕獲組不被初始化。在(\w*)的情況下,它將被初始化,但將是空的。因此,在Perl "!"=~/(\w+)?/; print $1;中將返回一個未定義的$ 1警告,而"!"=~/(\w*)/; print $1;則爲空字符串。

  • 性能方面,(\w*)必須略微中的步驟的數量,所述正則表達式引擎必須做,因此優選的方面更好。這當然取決於引擎。但與(\w*)相比,發動機將永遠不會執行回溯,與(\w+)?相比。

    作爲一個例子,我嘗試在Perl中使用use re 'debug'指令,並將兩個正則表達式與空字符串進行比較。您可以比較的步驟爲他們每個人:

""=~/(\w+)?/

Matching REx "(\w+)?" against "" 
    0 <> <>     | 1:CURLYX[0] {0,1}(10) 
    0 <> <>     | 9: WHILEM(0) 
            whilem: matched 0 out of 0..1 
    0 <> <>     | 3: OPEN1(5) 
    0 <> <>     | 5: PLUS(7) 
             ALNUM can match 0 times out of 2147483647... 
             failed... 
            whilem: failed, trying continuation... 
    0 <> <>     | 10: NOTHING(11) 
    0 <> <>     | 11: END(0) 

Match successful! 

""=~/(\w*)/

Matching REx "(\w*)" against "" 
    0 <> <>     | 1:OPEN1(3) 
    0 <> <>     | 3:STAR(5) 
            ALNUM can match 0 times out of 2147483647... 
    0 <> <>     | 5: CLOSE1(7) 
    0 <> <>     | 7: END(0) 
Match successful! 

PS。如果你不是Perl,我認爲它也可以用RegexBuddy來調試正則表達式(我從來沒有嘗試過,但我聽到很多)。

+0

結論:使用'(\ w *)',而不是'(\ w +)?'! – psxls

2

它基本上是一樣的吧?

是的。在你的具體情況。 (0 or 1) of (1 or more) = (0 or more)

+0

「在你的特定情況下」,你可以提供一個案例他們在哪裏不一樣? – OGHaza

+0

只是想讓人們照顧。我的意思是仔細看看正則表達式,看看你的模式是否適用(例如放置大括號等)。如果它令人困惑,我可以刪除評論。 – xagyg

相關問題