perl:正则表达式部分
使用简单模式匹配若模式匹配的对象是$_的内容,只要把模式写在一对(/)中就可以了。
[*]#$_="yabba dabba doo";
[*]#if (/abba/){
[*]#print "it matched!\n";
[*]#}
unicode属性
若要匹配某项属性,只需要把属性名放入\p{PROPERTY}里面。比如有许多字符属于空白符,相应的属性名为Space,要匹配这类的字符可以
[*]if(/\p{Space}/) {
[*]print "The string has some whitespace.\n";
[*]}
若要匹配数字,可以用Digit属性
[*]if(/\p{Digit}/){
[*]print "The string has a digit.\n";
[*]}
把小写的p改成大写P,就表示否定意义,匹配指定属性意外的字符。
元字符
点号(.)是能匹配任意一个字符的通配符,换行符不能匹配。如果希望点号仅匹配他本身,则在他前面加上反斜线。即任何元字符前面加上反斜线,就会使它失去元字符的特殊作用。反斜线是我们的第二个元字符,要匹配真正的反斜线,请用两个反斜线表示。
[*]$_='a real \\ backslash';
[*]if(/\\/){
[*] print "It matched!\n";
[*]}
[*]
简单的量词
星号(*)用来匹配前面的条目出现零次或多次的情况。点号星号(.*)组合起来可以匹配任意字符零到无限次。加号(+)会匹配前一个条目一次以上,以及匹配空格。问号(?)匹配前一个条目出现一次或者不出线。
模式分组
在正则表达式中,()的作用是对字符串分组,()也是元字符。/fred+/匹配的是freddddd,/(fred)+/匹配的是fredfredfredfred,/(fred)*/匹配的是任意字符。
[*]$_="abba";
[*]if (/(.)\1/)
[*] #if(/(.)(.)/)
[*] {
[*]print "It matched some character next to itself!\n";
[*]}
[*]
反向引用不必紧接在对应的捕获组括号后面。下面的模式会匹配y后面的4个连续的非换行符,并用\1反向引用表示匹配d后也出现这4个字符的情况。
[*]$_="abba dabba doo";
[*]if(/y(....) d\1/)
[*] #if(/y(....) d(....)/)
[*] {
[*] print "It matched the same after y and d!\n";
[*] }
也可以用多个括号来分成多组,每个组都可以有自己的反向引用。
[*]$_="yabba dabba doo";
[*]if (/y(.)(.)\2\1/)
[*]#if(/y(.)(.)(..)(.)/)
[*]{
[*] print "It matched after the y!\n";
[*] }
下面这种情况perl匹配的是\1,\11还是\111呢?
[*]use 5.010;
[*]$_="aa11bb";
[*]if(/(.)\111/)
[*] {
[*]print "It matched!\n";
[*]}
perl会认为是\111,那么如何避免呢?
[*]use 5.010;
[*]$_="aa11bb";
[*]if (/(.)\g{1}11)/{
[*] print "It maatched!\n";
[*] }
页:
[1]