zhouandtao 发表于 2018-8-31 09:50:20

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]
查看完整版本: perl:正则表达式部分