使用简单模式匹配
若模式匹配的对象是$_的内容,只要把模式写在一对(/)中就可以了。
- #$_="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";
- }