正则表达式-2(匹配)

-1-----------------------------------------------------------------------------------------------------------------
  1.用m//进行匹配:
    m//(pattern match operator,模式匹配操作符)
      还可以选择其界定符号,m(test),m<test>,m{test},m[test],m,test,m!test!.
      是不是看到这么的界定符有点晕了吧,其实我们选择一个常用的就可以了或你喜欢的界定符号。


 2.模式修饰符:
    perl有好几个模式修饰符(modifier),有时候也叫标志(flag),它们是一种追加在模式表达末尾定界符后面的的字母,用来
    修改默认的匹配行为。

   2.1.用/i进行大小写无关的匹配
   print "Would you like to play a game? ";
   chomp($_=<STDIN>);
   if(m/yes/i)  #进行大小写无关的匹配
   {
      print "In that case, I recomment that you go bowling.\n";
   }

   2.2.用/s匹配任意字符
      默认情况下,点号(.)无法匹配行行,这对于大多数单行匹配情况下是合适的。但如果字符串出现换行符,而你希望点能
      匹配这些换行符,那么/s修饰符就可以完成这个换行符的匹配。

      $_='I saw  Barney\ndown at the boling alley\nwith Fred\nlast night.\n';
      if(/Barney.*Fred/)
      {
         print "That string mentions Fred after Barney\n";
      }

  2.3.用/x加入空白符
     第三个修饰符允许我们在模式里随意加空白符,从而使他更容易阅读,理解:
     /-?[0-9]+\.?[0-9]*/  #挤在一起,难阅读
     / -? [0-9]+ \.? [0-9]*/x #加入空白好多了

     /
        -?       #一个可有可无的符号
        [0-9]+   #小数点前必须出现一个或多个数字
        \.?      #一个可有可无的小数点
        [0-9]*   #小数点后面的数字,有没有都没有关系
     /x

  2.4.组合选项修饰符:
    if(/barney.*fred/is)  #同时使用/i and /s
    {
        print "Taht string metnions fred after Barney\n";
    }

    if(m{
         barney  # barney
         .*      #任意字符
         fred    #fred

        }six) {#同时使用 /s , /i /x
           print "That string mentions Fred after Barney\n";
        }

-1-----------------------------------------------------------------------------------------------------------------

-2-----------------------------------------------------------------------------------------------------------------
 字符解释符方式:
    三种字符解释符:
       ACSII    修饰符/a  它会告诉perl仅在ASCII范围内阐释\w,\d\s等字符集。
       Unicode  修饰符/u  它会告诉perl仅对上面这写简写采用宽泛的匹配方式,只要是Unicode范围内定义的单词,数字,空白,都能匹配。
       locale   修饰符/l  它会告诉perl按照本地化设定阐释简写的意义,所以任何一个本地设定的字符编码认为是单词的字符 ,都会被\w简写匹配。

       /\w+/a   #仅仅是A-Z,a-z,0-9,_这些字符 
       /\w+/u   #任何Unicode当中定义单词的字符 
       /\w+/l   #类同于ASCII的版本,但单词的定义取决于本地化设定,所以如果设定为Latin-9的话

       chr() 函数,转换字符

-2-----------------------------------------------------------------------------------------------------------------



-3-----------------------------------------------------------------------------------------------------------------
锚位:
  \A 锚位匹配字符串的绝对开头 ,如果开头位置上不匹配,是会顺移下一个位置继续尝试。

  m{\Ahttps?://}i

  \z 锚位匹配字符串绝对末尾。

  m{\.png\z}i


  \Z 行末锚位,它允许后面出现换行符

 脱字符:

   ^:表示字符串开头锚位

   $: 表示字符串结尾

  /fred$/

  /^barney/


 单词锚位:
   锚位不局限于字符串首尾,比如\b是单单词边界锚位,它匹配任何单词的首尾。
   /\bfred\b/ #可匹配fred, 无法匹配frederic,alfred

   \b 锚位匹配的是一组连续的\w字符的开头或结尾。

   that 's  a "word" bondary

-3-----------------------------------------------------------------------------------------------------------------



-4-----------------------------------------------------------------------------------------------------------------
绑定操作符=~
   默认情况下匹配的操作对象是$_,绑定操作符(bingding operator, =~)会告诉perl,拿右边的模式来匹配左边的字符串,而不是
   匹配$_.


   my $some_ohter = "I dream of betty rubble.";
   if(#some_ohter =~ /\brubble/)
   {
      print "Aye,there's the rub.\n";
   }

 模式中的内插
   正则青表达式内部可以进行双引号形式的插入。

   my $what = 'larry';
   while(<>)
   {
      if(/\A($what)/)
      {
         print "We waw $what in beging of $_\n";
      }
   }

   不管$what的内容是什么,当我们进行模式匹配时,该模式会由$what的值决定。在这里,它等效于/\A(larry)/,也就在每行开
   头寻找larry.


-4-----------------------------------------------------------------------------------------------------------------


-5-----------------------------------------------------------------------------------------------------------------
捕获变量
  圆括号出现的地方一般都会触发正则表达式引擎捕获匹配到的字符串。捕获组会把匹配圆括号中模式的字符串保存到相应的地方。
 既然这些捕获变量保存的是字符串,那就说明白它是标量。 在perl里的名称就是$1,$2这样的形式存储它们的结果。

 $_='Hello there, neighbor';
 if(/\s([a-zA-Z]+),/)
 {
     print "$1\n";  #result 捕获空白符和逗号之间的单词
 }


 捕获变量的存续期
   捕获变量通常能存活到下次成功匹配为止。也就是说,失败的匹配不会改动上次成功匹配时捕获的内容,而成功的匹配匹配会将它们的重置。


 不捕获模式
    (?:) 匹配但捕获结果

    if(/(?:bronto)?saurus (steak|burger)/)
    {
        print "Fred wants a $1\n";
    }


命名捕获
  (?<LABLE>PATTERN),其中LABLE可以自行命名。

  访问变量: $+{LABLE}

  my $names = 'Fed or Barney';
  if($names = ~m/?<name1>\w+ (?:and|or) (?<name2>\w+)/)
  {
     say "I saw $+{name1} adn $+{name2}\n";
  }


 自动捕获变量
   $` 匹配区段之前的的内容

   $' 匹配到区段之后的内容

   $&  匹配整个区段的内容


-5-----------------------------------------------------------------------------------------------------------------




-6-----------------------------------------------------------------------------------------------------------------
优先级

    1.最高级是圆括号("()"),用于分组和捕获。圆括号里的东西总是比其他东西更有紧密性。

    2.第二级量词,也就是重复操作符:*, +,?,以及花括号表示的量词,比如{5,15},{3,} and {5}

    3.第三级是锚位和序列.\A,\Z,\z, ^, \b and \B

    4.第四级是择一竖线(|),由于它位于优先级表底部,所以从效果上来看,它会把各种模式拆分成数个组件

   圆括号(分组或捕获) (...),(?:...),(?<LABLE>...)
   量词     a*,a+,a?,a{n,m}
   锚位     abc,^,$, \A,\b,\z,\Z
   择一     a|b|c
   原子     a,[abc],\d,\1,\g{2}
-6-----------------------------------------------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值