2010-10-02 143 views
0

以下內容做了什麼?有人可以解釋我嗎?下面的代碼是做什麼的?

$data = "What is the STATUS of your mind right now?"; 

$data =~/.*/; print "$1,$2\n"; 

$data =~/(.*?)(u+).*/; print "$1, $2\n"; 

$data =~/(.?)(u+).*/; print "$1, $2\n"; 

$data =~/(\w+\s)+/; print "$1, $2\n"; 

什麼是$1 and $2?這是如何得到它的價值的?這些正則表達式是什麼?

感謝提前:)

回答

4

請閱讀perldoc perlretut,這將回答您的問題。

Perl正則表達式的一般參考是perldoc perlre,但您應該首先閱讀教程,因爲它可以作爲更好的介紹。

+0

OK但是,什麼是$ 1和$ 2? – TCM 2010-10-02 17:39:12

+0

@Nitesh:該問題在鏈接到的文檔的[提取匹配項](http://perldoc.perl.org/perlretut.html#Extracting-matches)部分中得到解答。 – Ether 2010-10-02 17:50:04

+0

@Nitesh:他們被稱爲反向引用。你有沒有讀過鏈接? – BoltClock 2010-10-02 17:50:24

0

$1$2是匹配的變量。它們指的是在最後一個正則表達式的各個括號匹配組中匹配的內容。

$1具有在第一個括號組中匹配的字符串部分。 $2具有在第二個括號組中匹配的字符串部分。你可以猜到$3將包含什麼。

讓我們看看你的例子:

$data = "What is the STATUS of your mind right now?"; 
$data =~/.*/; print "$1,$2\n"; 

這裏沒有括號,那麼1 $ 2和$不包含任何東西。

$data =~/(.*?)(u+).*/; print "$1, $2\n"; 

這裏有兩個括號組。第一個是(.*?),它不匹配任何東西或任何可以匹配的東西(以非貪婪的方式,但這是另一個話題)。第二個是(u+),它匹配一個或多個*「u」* s。

第一個(也是唯一一個)的「u」 $data是在中間的「你」,所以$1匹配萬萬直到第一「U」$2匹配一個「U」

$data =~/(.?)(u+).*/; print "$1, $2\n"; 

現在第一組是(.?),它匹配一個單個字符,或者什麼都不匹配。然後(u+)再次匹配一個或多個*「u」* s。

由於只是一個「U」在我們的字符串,第一組會收到一個單個字符,這是「O」,第二組將與實際「U」

$data =~/(\w+\s)+/; print "$1, $2\n"; 

最後,第一組匹配(\w+\s)+,其是一個或多個「字」字符,隨後是空白字符。 「字」字符是任何字母數字字符或下劃線。沒有第二組,但有+(一個或多個)符號。

那麼它匹配了什麼?這是一個奇怪的,我不確定我的理解是否100%準確。由於整個匹配組有+,它會吞噬儘可能多的字符串,並仍然匹配\w+\s。在這種情況下,它可以不顧一切,直到「右」,它然後作爲$1匹配。

然後,因爲它具有+,它會尋找任何更多的比賽隨即,但自從「正確」是匹配的,它永遠不會找到另一個小組賽中最右邊的字符串。

所以$1是 「正確的」,並$2是空的。

摘要:

當你看到了$ 1,$ 2,你應該尋找在最後的正則表達式匹配的組括號。