Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15649
  • 博文数量: 7
  • 博客积分: 390
  • 博客等级: 一等列兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-07 00:31
文章分类

全部博文(7)

文章存档

2009年(7)

我的朋友

分类:

2009-07-14 18:34:06

正则表达式 in Perl

//是m//的简写,可使用任何成对的分隔符,如:m(li), m{li}, m
  • ,也可以使用非配对符如 m^li^, m,li,.(即左右两边相同的分隔符)
  •  
    3个修饰符号
    /i 不区分大小写
    print "Please input yes or no to choose!\n";
    chomp($_==);
    if(/yes/i){
    print "You choice yes to continue the game!\n";
    }
    /s 匹配任何字符(重点是能让.操作符也能匹配换行符\n)
    $_="Unix will be\npopular in China\n";
    if(/Unix.*China/s){
    print  "It can be matched!\n";  #Unix China不在同一行也能匹配到!
    }
    /x 允许模式中加入任何数量的空格,所有空白都被忽略。
    修饰符允许混用,且顺序无关紧要。
    $_="Unix will be\npopular in China\n";
    if({Unix.*China}six){  #使用花括号作为分隔符,以及six3中修饰符的混用
    print  "It can be matched!\n";  #Unix China不在同一行也能匹配到!
    }
     
    锚定
    ^开头匹配
    $结尾匹配
    /^China$/ 能同时匹配"China"和"China\n".
    词届锚定
    \b 针对单词匹配,类似于全字匹配
    /\bfred\b/ 只能匹配fred,不能匹配 alfred, frederick, man fred mann #两个\b表示开头和结尾界定.
    /fred\b/ 能匹配fred, alfred
    /\bfred/ 匹配fred, frederick
    非词届锚定
    \B
    它将在任何非\b匹配的点上进行匹配。 /bsearch\B/将匹配seaches, searching, searched,但不能匹配search,researching   #!!!mark 不是很清楚
     
    绑定操作符 =~
    默认情况下,是匹配$_这个特殊的变量,使用=~能改变被匹配的变量为其左操作数
    print "Do you like football?\n";
    my $like_football=(=~/\byes\b/i); 
    if($like_football){
     print "You said you like the game!\n";
    }
    #接受输入行,然后绑定匹配操作,匹配忽略大小写,结果如果匹配返回true,否则false.并存入$like_football作为if的判断条件
     
    模式中内插
    my $what="li";
    while(<>){
        if(/^($what)/){
            print "Saw $what in beginning of $_"."\n";
        }
    }
     
    匹配变量
    模式中的括号,一对括号对应一块内存里面存着一个匹配变量,他们是$1,$2,$3....
    $_="Hello Perl, li";
    if(/\s(\w+),/){
        print "the word matched was $1\n";   # the word matched was Perl
    }
    这些匹配的变量$1,$2,$3...在下一次正确匹配后将被重写,也就是说如果下次匹配不成功,那么他们的值仍然为上次的匹配内容,所以建议避免使用它们,因为有可能是不正确的。
     
    自动匹配变量 (-_-|||Perl中总是很多这样的玩意儿,不过挺有意思的 :))
    $&,$`,$'
    匹配的字符串将自动存入$&
    if("Hello Perl, Li"=~/\s(\w+),/){
        print "That matched is $&\n";
    }
    $&里存入的是" Perl," 空格Perl逗号。而$1存入的只是括号对应的Perl
    $`存入匹配部分前一部分的内容,这里是Hello
    $'存入匹配部分后一部分的内容,这里是 Li
    ********书告诉我使用这3个变量的任意一个都会造成程序中其他正则表达式的执行效率降低,so warning there!!! but why? 诡异的...
     
    数量词的补充说明 (*+?)
    采用花括号{,} ,前面是下限,后面是上限。
    /iPod{3,10}/ #最少匹配3个iPod,最多匹配10个iPod,少于3个不匹配,大于10个的只匹配10个。(当然谁会嫌iPod多呢...)
    /iPod{3,}/  #无上限,所以最少匹配3个,最多不止境匹配
    /iPod{3}/  #确定匹配次数为3
    所以*+?其实就是:
    *: {0,}
    +: {1,}
    ?: {0,1}
     
    优先级从高到低是这样的
    括号(())>数量词(*+?)>锚定(^$\b\B)序列>或(|)
     
    ******关键一定要多练习
    阅读(537) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~