lujiguo115 发表于 2015-12-27 12:23:52

perl 正则表达式之匹配

  一、用m//进行匹配
  上篇用双斜线的写法表示模式,事实上是m//的简写,所谓简写,就是当用双斜线作为定界符的时候,可有省略开头的m。
  不使用简写的时候,可以使用任何定界符表示模式,m()、m<>、m!!等等
  二、模式匹配修饰符
  perl的模式匹配修饰符,有时也叫flag,是追加在模式表达式末尾定界符后面的字母,用来改变默认的行为
  /i进行大小写无关的匹配
  /s 匹配任意字符,会将模式中的点号转换成字符集[\d\D]来处理,使其匹配任何字符,包括换行
  /x 插入空白符,可有在模式中插入空白,perl会将空白和注释(注释部分别使用定界符)直接忽略,使用空白时,需要在前面加上反斜线,或使用\t、\s、\s+、\s*
  /a使用ASICC解释字符
  /u使用Unicode解释字符
  /l   用本地化语言的设定来解释字符
  /m 对多行进行匹配
  其他修饰符可以参阅perlop中有关m//部分
  组合选项时,只要将他们一起写在模式末尾



$_ = "I saw Barney \ndown at the bowling alley \nwith Fred\nlast night\n";
if(/Barney.*Fred/s){
print "has s yes \n";
}
if(/Barney.*Fred/){
print "no s yes \n";
}
  三、锚位
  通过给定锚位,让模式仅在字符串指定位置匹配
  \A 匹配字符串的绝对开头
  \z 匹配字符串 的绝对末尾
  \Z 允许字符串后面有换行符
  ^在字符集外面时,表示字符串开头,无/m时,同\A
  $字符串末尾
  \b 单词边界符,这里的单词指由英文字母,数字,下划线组成的字符,即匹配一组连续的\w字符的开头或结尾
  \B 非单词边界



$_ = 'http://www.baidu.com';
if(m{\AHttps?://}i){
print "yes \n";
}


$_ = 'that is a word boooo ';
if(/\bwor/){
print "1 \n";
}
if(/\bwor\b/){
print "2 \n";
}
if(/\bword\b/){
print "3 \n";
}
if(/\bword\B/){
print "4 \n";
}
  四、绑定操作符=~
  默认匹配的操作对象是$_,绑定操作符使操作对象为操作符左边的字符串
  正则表达式内部可以进行引号形式的内插
  五、捕获变量
  模式中出现圆括号的地方会触发正则表达的是引擎捕获匹配到的字符串,并保存在捕获变量中,即$1,$2。。。模式中有多少圆括号,就有多少捕获变量可以用
  六、不捕获模式(?:)
  七、命名捕获(?<LABLE>PATTERN)
  捕获到的内容会保存在特殊哈希%+里,访问时用$+{LABLE}
  反向引用\g{LABLE}或\k<LABLE>



my $name = 'Fred flintstone and Barney flintstone';
if($name =~ /(?<lastname>\w+) (?:and|or) \w+ \k<lastname>/){
print "i saw $+{lastname}\n";
}
  八、自动捕获变量
  $`    $&    $'
  ${^PREMATCH}   ${^MATCH}    ${POSTMATCH}



if('hello there, neighbor' =~ /\s(\w+),/){
print "that was ($`)($&)($') \n";
print "that was (${^PREMATCH})(${^MATCH})(${^POSTMATCH}) \n";
}
  九、通用量词{m,n}
  {0,}   *
  {1,}   +
  {0,1}   ?
  十、优先级
  圆括号(分组或捕获)    (...),(?:...),(?<LABLE>PATTEN...)
  量词                     a*,a+,a?,a{m,n}
  锚位和序列               abc, ^,$,\A,\z,\Z
  择一竖线               a|b|c
  原子                     a,,\d,\1,\g{2}
  
  
  
  
页: [1]
查看完整版本: perl 正则表达式之匹配