1. 多选结构
(mm|gg) 表示匹配 "mm"或"gg"
2. 忽略大小写
s/source/dest/i
搜索source,将其替换为dest,此处的i只对source起作用,而不会作用于dest。
3. 单词分界符
/< 用来匹配单词的开始
/> 用来匹配单词的结束
比如: /<cat 表示匹配以"cat"开头的单词,如cate
cat/>匹配以"cat"结尾的单词,如scat
则:/<cat/> 必须精确匹配 "cat"
4. 捕获括号及"反向引用"
在有些支持"反向引用"的地方,括号可以用来表示记忆,这种括号称为捕获括号,在后面,可以通过/1、/2、/3等来引用括号内匹配的表达式。(或用$1、$2等引用)
如:m//<([A-Za-z]+)/s/1/>/g
表示搜索两个相邻的,重复的单词。
/s表示任意多个空白字符。
/1就表示前面 ([A-Za-z]+)匹配到的内容。 所以,这个表达式的意思就是在开始找到一个单词,然后再判断它后面的那个单词,是否是一样的。
注意,如果用 (?:...)括号的话,它就不会起捕获作用了,它只起分组的作用。
5. 字符组
字符组是放在[]中的部分。
它类似于宿主语言中的一个子语言,它里面定义的元字符与宿主语言的很不相同。
[^...] 排除型字符组
6. 一些转义字符
/s 可以匹配任何“空白”字符,包括空格、tab、进纸符等。
/S 与/s相反,除/s之外的。(注意,它必要要匹配“字符”!如果不能匹配空)
/d [0-9],即数字。
/D 除/d之外的。
/w [a-zA-Z0-9],即匹配一个包含数字、字母的单词。
/W 除/w之外的。
/b 可以匹配单词起始 或 单词结束。
7. 环视功能
环视是用来在字符串不匹配任何字符,只匹配文本中的位置,注意,只是位置。
顺序环视:从左至右查看文本,尝试匹配子表达式,如果能够匹配,就返回匹配成功信息。
1) 肯定顺序环视:(?=...)
如:
文本信息为:my test string.
表达式: s/(?=test)/first /i
它就能匹配到test左边的位置!
然后用first 来替换这个位置,因为它只是一个位置,所以实际上就是插入。(实际上就像: s/^/yeah/g 中的^,在每行的开头插入"yeah")
最后经过处理的文本信息为:
my first test string.
2) 否定顺序环视:(?!...)
子表达式不能匹配右侧文本。
如:(?!/d),就表示该位置的右边不是数字的时候,就匹配成功。
3) 肯定逆序环视:(?<=...)
子表达式能够匹配左侧文本。
如:(?<=/d/d/d),就表示,在该位置的左边,必须是3个数字时才会匹配成功。
如:test321ff,如果用上面的表达式来匹配,最终匹配的位置是1的后面,f的前面。
4) 否定逆序环视:(?<!...)
子表达式不能匹配左侧文本。
8. 条件判断
结构:(?if then |else)
如:(god)?(?(1)pig|ciahi)
这个表达式就能产生这样的效果:
如果"god"参与了匹配,在它之后继续尝试匹配pig,如果god没有参与匹配,就会尝试匹配ciahi。
比如文本是: "godpi is not ciahi", 存在123.txt中。
在perl中使用如下命令:
perl -p -e "s/(god)?(?(1)pig|ciahi)/haha/g" 123.txt
就会输出:godpi is not haha
再如:(?(?<=NUM:)/d+|/w+)
如果出现了"NUM:",就会在它后面尝试匹配/d+,即一些数字。
如果没有出现"NUM:",就只匹配/w+,即普通单词。
9. 忽略优先量词 *?、+?、??
普通的量词*、+、?在匹配的时候,会匹配尽可能多的字符。
如:文本为:who is No. 5555?
则表达式 5+ 会将4个5全都匹配。
而忽略优先量词,匹配的时候只匹配尽可能少的字符。
表达式 5+? 只会匹配1个5.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ciahi/archive/2009/08/22/4471645.aspx