Randal L. Schwartz, Tom Phoenix & rian d foy. Learning Perl. 5th edition.
chapter 7: 漫游正表达式
May 30, 2011
Meta Character:
1. "." 任何单字符的通配符;
Examples: /bet.y/, betsy, bet-y, bet.y match; bety, betsey unmatch.
2. "\" 表示元字符,如"\.", "\\";
Examples: /3\.14159/
简易量词:
3. "*" 匹配前面的内容零次或多次;
Examples: /fred\t*barney/, "fredbarney", "fred\t\t\tbarney" match;
4. ".*"匹配任意字符无限多次;
Examples: /fred.*barney/, "fred akdjf akj barney" match;
5. "+" 匹配前一个条目一次以上;
examples: /fred +barney/, "fred barney", "fred barney" match; "fredbarney" unmatch;
6. "?" 匹配前一个条目出现一次或不出现;
模式分组:
7. ()元字符用来分组;
examples: /fred+/ match "freddddddd"; /(fred)+/ match "fredfredfred"; /(fred)*/ match "Hello, world", "".
8. 可用反向引用来引用()中的模式所匹配的文字。"\1", "\2" 这样的写法就是在使用反向引用。"\"后面的数字和()的组号匹配。
example:
$_="abba";
if (/(.)\1/) { # match to "bb"
print "It matched same character next to itself!\n";
}
说明:
"(.)"匹配任何非回车字符;"(.)\1" 表明需要匹配连续出现的两个同样的字符。"(.)"会首先匹配"a", 但是在匹配反向引用的时候就会发现下一个字符不是"a", 导致匹配失败。Perl会跳过这个字符,用"(.)"来匹配下一个字符 "b", 在匹配反向引用的时候会发现下一个字符也是"b", 匹配成功。
9. 反向引用不必总是附在相应的()后面。下面的模式会匹配"y"后面的4个连续的非回车字符, 并且用"\1"在"d"字符之后重复这个4个字符:
$_="yabba dabba doo";
if (/y(....)d\1/) {#match "abba"
print "It matched the same after y and d!\n";
}
10. 也可以多个()来分成多组,每组可以有自己的反向引用。可以用()定义一个非换行字符组,然后再跟上一个非换行字符的组。然后用反向引用 "\2" 和 "\1" 来构成有趣的回文模式,比如 "abba";
$_="yabba dabba doo";
if (/y(.)(.)\2\1/) { #match "abba"
print "It matched the same after y and d!\n";
}
说明:左括号的序号对应了相应的分组号。
Perl 5.10增加了采用 "\g{N}"的写法来反向引用,其中 "N" 是想要引用的组号。
example:
use 5.010;
$_="aa11bb";
if (/(.)\g{1}11/) {#match "\1"
print "It matched!\n";
}
用 "\g{N}" 的写法可以用负数,表示相对反向引用。
择一匹配
11. "|"表示左边匹配或右边匹配都可以。
example:
/fred|barney|betty/, 匹配任何含有"fred"或"barney"或"betty"的字符串。
/fred ( |\t)+barney/ 匹配"fred"和 "barney"之间空格、制表符或者两者组合出现一次以上的字符串,加号重复一次或更多。
/fred (and|or) barney/ 匹配任何含有"fred and barney" 或"fred or barney"的字符串。
字符集
12. 字符集是指一串可能出现的字符集合,通过写在[]内来表示。只匹配单个字符,但可以是字符集里列出的任何一个。
example:
[abcwxyz]会匹配这7个字符中的任何一个,可以使用"-"表示,[a-cwx-z].
[a-zA-Z]匹配52个字母中的任何一个; [\000-\177]匹配任何7位的ASCII字符。
13. 可以用字符集内部开状的地方加上脱字符"^",表示这些字符除外。
example:
[^def]匹配这三个字符以外的任何字符;
[^n\-z]匹配"n", "-", "z"以外的任何字符。
字符集的简写
[0-9]简写为"\d": 代表任意数字的字符集;
[A-Za-z0-9_]简写为 "\w":只含有字母、数字和下划线的单词中的任意一个字符。
example:
/fred \w+ barney/匹配fred, 一个空格,一个单词再接一个空格与barney.
[\f\t\n\r ]简写为"\s":匹配空白字符集中的某个字符,换页、制表、换行、回车及空格。"\s*"匹配任意数目的空白;"\s+"匹配一个以上的空白字符。
Perl5.10增加"\h"匹配横向空白([\t ]); "\v"匹配纵向空白([\f\n\r]); "\R"匹配任何类型的断行。
反义简写
[^\d]:匹配非数字;[^\w]:匹配非单词;[^\s]: 匹配非空白。
"\D", "\W", "\S"完成上述相应工作。
阅读(822) | 评论(0) | 转发(0) |