簡體   English   中英

請解釋一下這個Perl正則表達式

[英]Please explain this Perl regular expression

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

昨天我得到了構建此正則表達式的幫助,但我並不完全理解它。

它的名字像Parisi,Kenneth並打印出kparisi

已知:
s / =替代
m / =匹配


我嘗試搜索其余的內容,但找不到任何真正有助於解釋的內容。

我也不明白=〜應該如何計算為true或false,但是在這種情況下,它正在修改字符串。

我發現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:\>

在這種情況下,我將其中一張備忘單釘在我的立方體牆上。 Google為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與逗號后面的空格后面的第一個字符匹配。

下載“ Regex教練”並進行探索。 考慮購買“掌握正則表達式”,因為它會帶您穿越這個雷區。 這是我見過的最好的排版書籍之一,內容豐富而又深入。

YAPE :: Regex :: Explain有一個很棒的Web前端。

這是s / ['-] // g的解釋

對於m /(\\ w +),?(。)/

第一行:[]('和-)內的字符將被匹配,並被替換為空,因此將其刪除。 / g表示全局,將嘗試匹配字符串中的所有內容。

第二行:\\ w表示單詞字符,+表示不止一次。 表示0或一次。 “。” 意味着什么。 因此,這意味着找到不止一次找到的任何單詞字符,然后是逗號,然后是零或一次空格,然后是任何字符之一。

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

s/運算符是Perl中的一個修改型正則表達式-您將LHS與右側的第一部分( foo )相匹配。 第二部分在第一部分( bar )中指定匹配項的替換。 因此,“ Lafooey ”轉到“ Labarey ”。

在您的問題中,目標是刪除所有“和”,例如“ O'Hanlon”和“ Chalmonly-Witherington-Smyth”中的。

然后匹配“姓氏,名字的名字”。 括號將這些匹配項的值放入變量$1$2

並打印小寫的“ F” +“姓氏”,因為它們是$2$1中的值。

最后,您可以根據電話號碼簿樣式列表中該人的真實姓名為該系統提供一個可行的用戶名。

iirc =〜表示等於匹配項(如果匹配則僅返回“〜”,如果返回true)

=~將左側的表達式(字符串)與右側的正則表達式匹配,它不會修改字符串。 作為副作用,將變量$1$2 ,...設置為匹配的括號部分。

在您的情況下,第一個括號將匹配“ (\\w+) ”(重復一次或多次的單詞字符,第二個將匹配“ (.) ”(給定名稱的第一個字母。“ ? ”表達式將匹配一個可選空間。

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

$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])。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM