使用简单模式匹配

若模式匹配的对象是$_的内容,只要把模式写在一对(/)中就可以了。

  1. #$_="yabba dabba doo"
  2. #if (/abba/){ 
  3. #print "it matched!\n"
  4. #} 

unicode属性

若要匹配某项属性,只需要把属性名放入\p{PROPERTY}里面。比如有许多字符属于空白符,相应的属性名为Space,要匹配这类的字符可以

  1. if(/\p{Space}/) { 
  2. print "The string has some whitespace.\n"; 

若要匹配数字,可以用Digit属性

  1. if(/\p{Digit}/){ 
  2. print "The string has a digit.\n"; 

把小写的p改成大写P,就表示否定意义,匹配指定属性意外的字符。

元字符

点号(.)是能匹配任意一个字符的通配符,换行符不能匹配。如果希望点号仅匹配他本身,则在他前面加上反斜线。即任何元字符前面加上反斜线,就会使它失去元字符的特殊作用。反斜线是我们的第二个元字符,要匹配真正的反斜线,请用两个反斜线表示。

  1. $_='a real \\ backslash'
  2. if(/\\/){ 
  3.     print "It matched!\n"; 
  4.  

简单的量词

星号(*)用来匹配前面的条目出现零次或多次的情况。点号星号(.*)组合起来可以匹配任意字符零到无限次。加号(+)会匹配前一个条目一次以上,以及匹配空格。问号(?)匹配前一个条目出现一次或者不出线。

模式分组

 在正则表达式中,()的作用是对字符串分组,()也是元字符。/fred+/匹配的是freddddd,/(fred)+/匹配的是fredfredfredfred,/(fred)*/匹配的是任意字符。

  1. $_="abba"
  2. if (/(.)\1/) 
  3.    #if(/(.)(.)/) 
  4.  { 
  5.   print "It matched some character next to itself!\n"; 
  6.   } 
  7.     

 反向引用不必紧接在对应的捕获组括号后面。下面的模式会匹配y后面的4个连续的非换行符,并用\1反向引用表示匹配d后也出现这4个字符的情况。

  1. $_="abba dabba doo"
  2.   if(/y(....) d\1/) 
  3.       #if(/y(....) d(....)/) 
  4.      { 
  5.      print "It matched the same after y and d!\n"
  6.     } 

 也可以用多个括号来分成多组,每个组都可以有自己的反向引用。

  1. $_="yabba dabba doo"
  2. if (/y(.)(.)\2\1/) 
  3.   #if(/y(.)(.)(..)(.)/) 
  4.   { 
  5.     print "It matched after the y!\n"
  6.    } 

 下面这种情况perl匹配的是\1,\11还是\111呢?

  1. use 5.010; 
  2. $_="aa11bb"
  3. if(/(.)\111/) 
  4.  { 
  5.   print "It matched!\n"
  6.   } 

perl会认为是\111,那么如何避免呢?

  1. use 5.010; 
  2. $_="aa11bb"
  3. if (/(.)\g{1}11)/{ 
  4.     print "It maatched!\n"
  5.    }