2013-03-11 619 views
1

正則表達式中的(.*)(.*?)有什麼不同?正則表達式中(。*)和(。*?)之間的區別是什麼?

我用下面的字符串:

<select name="show"> 
    <option value="all"  >all php.net sites</option> 
    <option value="local" >this mirror only</option> 
    <option value="quickref" selected="selected">function list</option> 
    <option value="manual" >online documentation</option> 
    <option value="bugdb" >bug database</option> 
    <option value="news_archive">Site News Archive</option> 
    <option value="changelogs">All Changelogs</option> 
    <option value="pear"  >just pear.php.net</option> 
    <option value="pecl"  >just pecl.php.net</option> 
    <option value="talks" >just talks.php.net</option> 
    <option value="maillist" >general mailing list</option> 
    <option value="devlist" >developer mailing list</option> 
    <option value="phpdoc" >documentation mailing list</option> 
</select> 

正則表達式:/<option\svalue=(.*)>/s

返回一個結果,其所有的選項值一個字符串。

正則表達式:/<option\svalue=(.*?)>/s

返回13個結果。

通過觀察輸出,我發現.*搜索從最後和.*?搜索從一開始是這是一個正確的假設?

+0

http://stackoverflow.com/questions/3075130/difference-between-and-for-regex/3075532#3075532 – 2013-03-11 04:33:46

回答

5

‍‍.*?匹配所有字符直到發現.*?之後的下一個模式。但.*只是匹配所有的字符。

hellohello,h.*o將匹配hellohello。但h.*?o只匹配hello

.*被稱爲貪婪而且.*?被稱爲非貪婪。

+0

錯誤的解釋。反例:'/h.*?o $ /' – ikegami 2013-03-11 05:36:49

+1

@ikegami'$'是主播。這個*錨*將模式錨定到最後。所以這裏'。*?'開始匹配,除非找到最後一個「o」。 – 2013-03-11 15:48:47

2

?reluctant quantifier,也稱爲「非貪婪」。沒有它,正則表達式儘可能地匹配(默認)。這就是爲什麼它被稱爲「貪婪」。用「不情願」的量詞,正則表達式試圖儘可能少地匹配以滿足匹配。

2

默認情況下正則表達式匹配貪婪。而?使它變得懶惰。

0

貪婪和非貪婪匹配

Perl的正則表達式匹配正常的最長的字符串可能。例如:

my($text) = "mississippi"; 
$text =~ m/(i.*s)/; 
print $1 . "\n"; 

執行上面的代碼,這裏就是你:

ississ 

它的第一個我,最後一個S,一切都匹配在他們之間。但是如果你想把第一個我跟最緊密的跟隨呢?使用此代碼:

my($text) = "mississippi"; 
$text =~ m/(i.*?s)/; 
print $1 . "\n"; 

現在看的代碼會產生什麼:

is 

顯然,使用問號使得比賽不貪婪。但是還有一個問題是正則表達式總是儘可能早地匹配。