Perl入門筆記-正則表達式

Learning Perl 

第七章 正則表達式
正則表達式,Perl裏面稱爲模式(pattern),用來表示匹配某個字符串的特徵模板。
正則表達式與shell的文件名匹配通配符(glob)不一樣。
使用簡單模式
若要匹配對象$_的內容,把模式卸載一組斜線就能夠了。
$_ = "abc ab sd ed";
if (/ab/) {
    print "It matched.\n";
}

Unicode屬性
Unicode字符可以理解自身含義,除了匹配字符自己外,還根據字符的屬性來達成匹配。
每一個屬性都有一個名字,要匹配某個屬性,只要把屬性名放入\p{PROPERTY}裏面。好比空白符,屬性名爲Space,能夠用\p{space}來匹配:
if (/\p{Space}/) {
    print "The string has some whitespace.";
}
若是匹配數字,能夠用Digit屬性:
if (/\p{Digit}/) {
    print "The string has a digit.";
}
匹配連續兩個十六進制字符
if (/\p{Hex}\p{Hex}/) {
  print "The string has a pair of hex digits.\n";
}
匹配不包含特定屬性的字符,使用大寫P,表示否認意義。

關於元字符 .
簡單的量詞 * + ?
模式分組,小括號,能夠反向引用來引用圓括號中模式匹配的文字,成爲捕獲組(capture group)。反向引用的寫法是在反斜線後面接上數字編號,好比\1,\2。相應的數字表示對應順序的捕獲組。
圓括號包括的點號匹配任意非換行符,反向引用\1來再次匹配圓括號內的任意字符:
if (/(.)\1/) {
  print "It matche same char next to itself.\n";
}
反向引用沒必要緊跟在對應的捕獲組括號後面。
也能夠用多個括號分紅多個分組,每組都有本身的反向引用。
if (/a(.)(.)\2\1/) {
  print "It matche after y.\n";
}
區分那個括號是第幾組,能夠依次點算作括號的序號。
\111反向引用會匹配儘量大的組號。
Perl5.10後支持\g{N}的寫法。N爲反向引用的組號。相對反向引用(relative back reference)能夠支持負數編號。
擇一匹配
豎線(|)讀成或,執行效率取決於正則表達式引擎內建的優化策略。
字符集指的是一組可能出現的字符。[]能夠匹配任意一個個字符。
連字符-表示始末範圍。脫字符^表示除了這些字符以外。
大寫\D\W\S,能夠表示非數字,非單詞,非空白符。

習題
1. 寫一個程序,從輸入中讀取數據,遇到包含cao字符串的行就打印該行。
2. 修改上題程序,從輸入中讀取數據,遇到包含cao或Cao字符串的行就打印該行。
3. 寫個程序,只輸出輸入中含有點號的每一行,若是沒有就忽略。
4. 寫個程序,輸出含有要求單詞的行。

答案
1.
while (<>)
    if (/cao/) {
        print;
}
2.
while (<>)
    if (/[cC]ao/}
        print;
}
3.
while (<>)
    if (/\./) {
        print;
}
4.
while (<>)
    if (/[a-z][A-Z]/) {
        print;
}s
相關文章
相關標籤/搜索