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