【初学小骆驼】漫游正则表达式王国
正则表达式是一个匹配某字符串的模板
Unix的grep命令检查哪些行文本匹配指定的模式。example,某个文件哪一行提到了flint,并且同一行内还跟着stone,可以用$ grep 'flint.*stone' chapter*.txt
chapter3.txt:……………………
chapter3.txt:……………………
chapter9.txt:……………………
写法example,
$_ = "yabba dabba doo";
if(/abba/) {
print "It matched!\n";
}
表达式/abba/会在$_中寻找这四个字符组成的串,找到了就返回真,不然是假。
元字符
点号. 是任何单字符的通配符(换行符除外)。
example,
/bet.y/匹配betty、betsy、bet=y。不匹配bety或betsey。 假如希望.只匹配它本身,就\.。
星号* 匹配前面的内容重复零次或多次。
example,
/fred\t*barney/匹配fred和barney之间任意多个制表符。
.* 匹配任意字符无限多次,捡破烂模式。
加号+ 匹配前一个条目一次以上。
example,
/fred +barney/匹配fred和barney之间有一个以上空格的字符串。除空格外不可有其他字符。
问号? 表示前一个条目可有可无,即前一个条目可以出现一次或不出现。[0,1]。
圆括号() 用来分组。
example,
/fred+/匹配像freddddddddd
/(fred)+/匹配像fredfredfred
/(fred)*/匹配像Hello, world
圆括号和反向引用 \1、\2斜线后面的数字和括号的组号匹配。
example,
/(.)\1/匹配重复一次的字符串,aa、bb、cc、dd……
/y(....)d\1/匹配y后面四个连续的字符,再跟一个d,然后再重复这四个字符。
/(.)(.)\2\1/匹配类似abba、dnnd这样的回文模式。
/y((.)(.)\3\2) d\1/匹配类似yabba dabba这样的。
于是perl 5.10里运用新的反向写法\g{N} N是想要反向引用的组号
example,
/(.)\g{1}11/匹配aa11、bb11这样的。
甚至可以用负数/(.)(.)\g{-1}11/匹配?
择一匹配--竖线| 匹配左边或右边都行。
example,
/fred( |\t)+barney/匹配fred和barney之间空格、制表符或两者组合出现一次以上的字符串。
字符集
方括号[] 它匹配字符集列出的的任何一个单个字符。
经典字符集[a-zA-Z] [\000-\177]匹配任何7位ASCII字符。
脱字符^ 表示这些字符除外。 [^def]匹配除这三个字符以外的任何字符。
HAL模式/HAL-[0-9]+/
简写
\d 代表任意数字的字符集[0-9]
/HAL-\d+/ 代表HAL模式/HAL-[0-9]+/
\w 表示单词字符,匹配单词字符集里的一个字符。
/fred \w+ barney/匹配fred、一个空格、一个单词、一个空格和barney。
\s 处理空白。\s*匹配任意数目的空白,\s+匹配一个以上的空白字符。
/[\dA-Fa-f]+/匹配十六进制字符
[\d\D]表示任何数字或非数字,即匹配任何字符!
[^\d\D]什么都不匹配
perl 5.10 增加了许多:
\h 匹配横向空白
\v 匹配纵向空格
\R 匹配任意类型的断行