加载中…
个人资料
Yode
Yode
  • 博客等级:
  • 博客积分:0
  • 博客访问:595,259
  • 关注人气:250
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

perl--正则表达式

(2008-08-22 15:59:42)
标签:

perl

正则表达式

.[]

w

d

s

it

1)模式匹配中的量词*:*表示匹配前一项0次或者多次。

     举例:/fred\t*barney/   将匹配上fredbarney之间有任意个tab的字符串。

2.*:匹配任意的字符

     .表示可以匹配任意的单字符。

     /fred.barney/将匹配上fredbarney之间的任意的一个单字符。

     那么.*就表明可以匹配任意的字符了。注意这里的任意包含0次,也包含任意的字符串。。。

(3) ?含义是前面的一个项出现一次或者0次。

   /fred?barney/意思是fredbarney之间的d出现0次或者1次,所以能匹配上的只有2种情况       fredbarney   frebarney

4+:含义是前面的一项出现1次或者多次。常用的搭配 .+表示任意字符至少出现1次

5)()其实这个更重要啦,因为匹配单个的字符的时候/fred+/这个意义不大,很多时候我们希望fred这个字串整个的匹配。使用的就是/(fred)+/

(6)选择符 | or

匹配一个或者另外一个

/fred|barney/ 包含fred或者breney的字符串都可以。在匹配的时候呢,尽量通过变量进行匹配。

7[]字符类是[]内的一列字符,可以匹配上括号内出现的任意单个字符。注意是单个字符哦。。。

常用的[a-z][A-Z][0-9]或者用[a-zA-Z0-9]

其中[a-zA-Z0-9]\w来表示,[0-9]\d来表示,[\f\t\n\r][\s]来表示,即空白字符。这里的\s与下面要提到的/s相区别,//s是修饰符,表示可以匹配任意字符,包括换行在内。经常使用\s*或者\s+.

\w+经常用来表示单词。

(8)^ 表示相反的意思,比如[^a-z]就会匹配除a-z之外的任意字符。。。注意:^只有在[^\d],[^\w],[^\s]中的时候表示补集的意思,其他情况下^表示字符串的开头。

 

习题一:找出输入的字符串中包含fred的并打印,注意只打印包含fred的行

#!/usr/bin/perl

use strict;

use warnings;

while(<>){   #每次一行输入,这里其实是省略的用法,默认为<STDIN>,当然如果在命令行执行的话,应该是先执行命令行输入的文件名。

       chomp;

       if(/fred/){

              print;#也是省略print $_;

              next;#功能类似于continue;

       }

       elsif(/end/){

       last;#功能类似于break

}

}

下面看从文件中逐行读入,完成同样的功能

#!/usr/bin/perl

use strict;

use warnings;

my $localfile="c:\\1.txt";

open FILE,"<$localfile" or die "can't open $localfile.";#FILE是个句柄,<说明将$localfile的内容用句柄FILE来表示。

while(<FILE>){

       if(/fred/){

              print;

       }

       elsif(/end/){

              last;

       }

}

 

补充:<>

while (defined($line = <>)){

chomp($line);

print “It was &line that I saw!\n”;

}

运行此程序,调用参数为fred, barney, betty,则结果大概如下:“It was [a line from file fred] (文件中fred 的一行)that I saw!,It was [another line from file fred](文件fred 中的另一行) that I saw!,直到文件fred 的结尾。然后,将自动转到文件barney,一行一行的输出,最后到文件betty。从一个文件到另一个文件之间没有空行,当使用<>时,就像输入的是一个大文件一样。如果输入结束时,<>将返回undef(同时退出while 循环)。


习题2:有一个字母大写,而非所有字母大写。

/[A-Z][a-z]+/

习题3:写一个程序,它能输出所有同时提到wilma fred 的行。

/wilma.*fred | fred.*wilma/


 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有