2008-12-19 100 views
1
$rowfetch =~ s/['-]//g; #All chars inside the [ ] will be filtered out. 
    $rowfetch =~ m/(\w+), ?(.)/; 
    printf $fh lc($2.$1); 

昨天我得到了構建這個正則表達式的幫助,但是我並沒有完全理解它。

這需要像帕裏西,肯尼思的名稱,並打印出kparisi

的已知,:
S/=替代
米/ =匹配


我試圖尋找其餘的,但無法找到任何東西,真的幫瞭解釋。

我也不明白=〜應該如何評估爲真或假,但在這種情況下,它正在修改字符串。
請解釋這個Perl正則表達式

+0

你應該去與康拉德的解決方案(後我固定它)。那個人很容易理解。 – 2008-12-19 15:00:44

+0

哦,我不知道你已經修好了......我會測試它,謝謝......儘管Vinko的解決方案對我來說工作很好。我不知道你是否看到了我們的評論帖子,但他幫助擺脫了字符串中的其他字符。我會告訴你,如果你的作品,謝謝。 – CheeseConQueso 2008-12-19 15:04:16

+0

它將Parisi,Kenneth變成kparisienneth
$ rowfetch =〜s /(\ w +),\ s(\ w)/ $ 2 $ 1 /;
$ rowfetch =〜s /([a-z] +)\ s([a-z])/ $ 2 $ 1/i;
$ rowfetch = lc $ rowfetch; – CheeseConQueso 2008-12-19 15:16:07

回答

10

我將這些cheat sheets中的一個固定在我的立方體牆壁上用於這種場合。谷歌爲regular expression cheat sheet找到其他人。

要添加到你已經知道:

g -- search globally throughout the string 
    + -- match at least one, but as many as possible 
    ? -- match 0 or 1 
    . -- match any character 
() -- group these together 
    , -- a plain comma, no special meaning 
[] -- match any character inside the brackets 
\w -- match any word character 

神奇的是在分組 - 匹配表達式使用組,並將它們放入變量$ 1和$ 2。在這種情況下,$ 1與逗號之前的單詞相匹配,$ 2與逗號之後的空格之後的第一個字符相匹配。

22

我找到YAPE::Regex::Explain模塊非常有益的 -

C:\>perl -e "use YAPE::Regex::Explain;print YAPE::Regex::Explain->new(qr/['-])->explain;" 
The regular expression: 

(?-imsx:['-]) 

matches as follows: 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
(?-imsx:     group, but do not capture (case-sensitive) 
         (with^and $ matching normally) (with . not 
         matching \n) (matching whitespace and # 
         normally): 
---------------------------------------------------------------------- 
    ['-]      any character of: ''', '-' 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 



C:\>perl -e "use YAPE::Regex::Explain; print YAPE::Regex::Explain->new(qr/(\w+), ?(.)/)->explain;" 
The regular expression: 

(?-imsx:(\w+), ?(.)) 

matches as follows: 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
(?-imsx:     group, but do not capture (case-sensitive) 
         (with^and $ matching normally) (with . not 
         matching \n) (matching whitespace and # 
         normally): 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    \w+      word characters (a-z, A-Z, 0-9, _) (1 or 
          more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    ,      ',' 
---------------------------------------------------------------------- 
    ?      ' ' (optional (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    (      group and capture to \2: 
---------------------------------------------------------------------- 
    .      any character except \n 
---------------------------------------------------------------------- 
)      end of \2 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 

C:\> 
1

第一行:[]內(」和 - )的字符由無匹配和替換(一個或多個),從而除去。/g表示全局,並將嘗試匹配字符串中的所有內容。

第二行:\ w表示單詞字符,+表示不止一次。 ?意味着0或一次。 「」意味着什麼。所以它意味着找到任何一個字符,不止一次發現,接着是昏迷,接着是零或一次空格,然後是任何字符。

1
$lhs =~ s/foo/bar/g; 

s/運算符是在Perl的修飾正則表達式 - 您對右側(foo)第一部分匹配LHS。第二部分指定替換第一部分中的匹配(bar)。所以「Lafooey」轉到「Labarey」。

在你的問題中,其目的是要消除「奧漢隆」和「查爾蒙利 - 威瑟林頓 - 史密斯」中的所有「類似」。

然後它匹配「姓氏,名字的第一個字符」。括號將這些匹配的值放入變量$1$2

並打印「F」+「姓氏」的小寫字母,因爲這些是$2$1中的值。

在它結束時,您可以根據電話簿樣式列表中的個人真實姓名爲系統提供可用的用戶名。

1

IIRC的=〜手段使等於匹配(參見「〜」如果匹配單獨返回true)

1

=~關於對正則表達式其左手側上的表達(字符串)匹配在其右手方面,它不會修改字符串。Asa的副作用是將變量$1,$2 ......設置爲匹配的括號中的部分。

在你的情況下,第一托架將匹配「(\w+)」(單詞字符重複一次或更多的時間,和第二將匹配「(.)」(給定名稱的第一個字母。的「 ?」表達將匹配的可選空間

3

下載「The Regex Coach」並探索它 考慮購買「掌握正則表達式」,因爲它會引導你通過這個雷區,它是我見過的最好的排版書籍之一,內容豐富但無法滲透

1

請注意,如果輸入的格式不正確,給定的代碼就會失敗在。這是我會做:

$rowfetch =~ s/[ '-]//g; #All chars inside the [ ] will be filtered out. 
if($rowfetch =~ m/(\w+),([a-z])/i) { 
    printf $fh lc($2.$1); 
} 

的$ 1- $ 9個的位置變量保持最後的匹配成功,但他們沒有失敗的比賽的情況下重置。這意味着如果正則表達式不匹配,$ 1和$ 2將不會被刪除,並且最終得到的不是您想要的內容。

我也改變了正則表達式。第一行也刪除空格。由於您似乎在創建用戶名或電子郵件地址,因此您不需要空格。第二行更嚴格,以確保$ 2是一封信,而不是其他字符。最後的'i'告訴perl使所有字母匹配不區分大小寫。有了它,我不必做第二部分([a-zA-Z])。