4.1 perl--漫游正则表达式

正则表达式(regular expression)是perl内嵌,自成一体的微型编程语言。出现在很多语言中,以及在大多数的程序员文本编辑器中(比如vi和emacs).在perl里通常叫做模式(pattern),用来表示匹配或不匹配某个字符段的特征模板。只要用一个模式就可以将它们干净利落地分成两组:匹配或者不匹配。

在Unix的grep命令中,它会检查哪几行文本匹配到指定的模式,然后输出那几行。例如:

$grep 'flint.*stone' chapter*.txt

如果模式匹配的对象是$_的内容,只要模式写在一对斜线(/)中就可以了,自动去寻找

例如:

$_="yabba dabba doo"'
         if (/abba/){
          print;
           }

Unicode属性

他们不只是简单的字节序列。每个字ifu出来字节组合之外,还有属性信息。若要匹配某项属性,只需要把属性名放入\p{PROPERTY}\里面。比如许多字符属于空白符,相应的属性名为space,所以要匹配带有这类属性的字符,可以用\p{Space}.将小写的p改为大写的P,就表示否定的意义,匹配指定属性之外的字符。

. 能匹配任意一个字符的通配符(不能匹配换行符\n),如果要表示点号本身的话,就需要在前面加上反斜线转   义。同时,如要匹配真正的\,也需要在前面加上\。
* 用来匹配前面的条目零次或多次的。
+ 匹配前一个条目一次以上。
? 表示前一个条目是可有可无的
() 对字符串来分组

我们可以用反向引用来引用圆括号中的模式所匹配的文字,这个行为我们成为捕获组。

(.)\1 表示匹配连续出现的两个同样的字符。\后面的数字是编号,只要一次点算左括号的序号就可以了/

$_="yabba dabba doo";
if (/y((.)(.)\3\2)d\1/){
 print;
}

有的时候为了消除反向引用模式的直接量部分的二义性

use 5.010;     #这个版本开始才有这个功能
$_="aa11bb";
if (/(.)\g{1}11/){
print;
}

这里面的g{1}就相当于\1,主要是为了避免歧义嘛,同时,也可以用负数,相反的意思。

|  通常读成“或”,要么匹配左边的内容,要么匹配右边的内容。
[] 表示里面的字符集中任何一个,比如[a-z],其中-是连字符,表示从a到z
^  表示除什么之外,[^a-z]除a到z之外的任意的字符都能匹配

字符的简写

  • 表示任意一个数字的字符集的简写是\d
  • \s 匹配任意空白符
  • \w现在被扩展了,表示单词嘛

[\d\D] 表示任何数字或非数字,就是说能匹配到任意的字符。它跟.相比的话,这个同时还包括换行符。

例1:检验已知文件中是否含有fred或者Fred字符,有的话就把这一行打印出来。

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
   if(/(f|F)red/){
    print ; 
      }
     }

例2:找包含.的字符串,打印出来那一行。这里面相当用了一个转义符

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
   if(/\./){
    print ;
      }
      }

例3:打印那些有两个相连且相同的非空字符的行。

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
   if(/(\S)\1/){
    print ;
      }
      }

例4:打印出同时出现wilma以及fred的行(注意先后之别)

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
 if (/wilma.*fred|fred.*wilma/){
   print;
     }
    }

ps:

  1. 上面的方法尽管参考,方法肯定不止一个
  2. 如果跟我一样是菜鸟,请结合我的第之前的博客看如何运行这样的脚本。
  3. 博文内容为整理的《Perl语言入门》这本书,感谢这个书的作者Randal L等人的付出
药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn