2013-03-24 53 views
3

我很難理解regex的基本規則,希望有人能夠用「簡單英語」來解釋它們。Perl中關於正則表達式的基本規則的困惑

$_ = '1: A silly sentence (495,a) *BUT* one which will be useful. (3)'; 

print "Enter a regular expression: "; 
my $pattern = <STDIN>; 
chomp($pattern); 

if (/$pattern/) { 
    print "The text matches the pattern '$pattern'.\n"; 
    print "\$1 is '$1'\n" if defined $1; 
    print "\$2 is '$2'\n" if defined $2; 
    print "\$3 is '$3'\n" if defined $3; 
    print "\$4 is '$4'\n" if defined $4; 
    print "\$5 is '$5'\n" if defined $5; 
} 

三個測試輸出

Enter a regular expression: ([a-z]+) 
The text matches the pattern '([a-z]+)' 
$1 is 'silly' 

Enter a regular expression: (\w+) 
The text matches the pattern '(\w+)' 
$1 is '1' 

Enter a regular expression: ([a-z]+)(.*)([a-z]+) 
The text matches the pattern '([a-z]+)(.*)([a-z]+)' 
$1 is 'silly' 
$2 is " sentence (495,a) *BUT* one which will be usefu' 
$3 is 'l' 

我的困惑是如下

  1. ([a-z]+)意味着 「一個小寫字母和一個/更多個重複」?如果是這樣,不應該「拾起」以及?除非它與()關於內存有關(即「愚蠢」是5個字母的單詞,所以「will」將不會被拾取,但「willx」將會?)

  2. 不是(\w+)意思是「任何單詞和一個/多個重複」?如果是這樣,爲什麼數字「1」拿起,因爲沒有重複,但冒號「:」事後?

  3. 確實([a-z]+)(.*)([a-z]+)表示「任何小寫字母和重複」,緊接着是「任何和0或更多的重複」,緊接着是「任何小寫字母和重複」?如果是這樣,爲什麼輸出看起來像上面顯示的那樣?

我試着儘可能在網上查找,但仍然無法理解它們。任何幫助將不勝感激。謝謝。

回答

6
  1. 不,它的意思是「一個或多個不帶小寫字母的拉丁字母」。

    是的,"will"也會匹配,但匹配op只會返回第一個匹配,除非您使用/g

    print "$1\n" while /([a-z]+)/g; # //g in scalar context 
        or 
    print "$_\n" for /([a-z]+)/g; # //g in list context 
    

    關於如何使用/g細節見perlopm/PATTERN/

  2. 不,它的意思是「一個或多個字符」,因此它確實可以匹配單個字符。

    或者你也許感到驚訝1是一個字符?在ASCII範圍中,字符字符是A-Za-z,0-9_。在ASCII範圍之外發現另外的102,661個字符。

  3. 它的意思是「一個或多個無重音的小寫拉丁字母,後面是除換行符之外的任意數量的字符,後跟一個或多個無重音的小寫拉丁字母」。

    如果你問爲什麼.*匹配這麼多,引擎將始終匹配在當前位置儘可能多。這被稱爲貪婪。

    也許您在尋找/([a-z]+)([^a-z]+)([a-z]+)/

0
  1. 我真的不知道爲什麼你會這麼想。它看着你的句子並找到第一個小寫字母,並繼續匹配它們,直到它找不到一個。 (在你的情況下一個空間)比賽是'愚蠢的',它應該是。匹配在該點停止。

  2. \w匹配一個「單詞字符」,包括數字,但不包括標點符號,而不是「_」「:」不是單詞字符,因此您得到「1」而沒有別的。

  3. 這是因爲(.*)是「貪婪」(通常你不應該使用它)。你告訴Perl匹配任何東西和一切到行的末尾。然後它回溯給你一個匹配你的最後一次檢查,這是你的字符串的最後一個字符。

編輯:作爲@ikegami指出,這實際上\w匹配比我想相當多的。

+0

我沒有想到ascii以外的任何東西,但我已編輯以反映 – Cfreak 2013-03-24 22:58:18