首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

perl 正则表达式

perl 正则表达式

首先我们应该知道 Perl 程序中,正则表达式有三种存在形式,他们分别是:

匹配:m/<regexp>;/ (还可以简写为 /<regexp>;/ ,略去 m)  
(或者是以m开头的任意字符作为不同的分界符,如m#...#或者m@...@  等等)

替换:s/<pattern>;/<replacement>;/

转化:tr/<pattern>;/<replacemnt>;/




匹配操作符 =~、!~


=~检验匹配是否成功:$result = $var =~ /abc/;若在该字符串中找到了该模式,则返回非零值,即true,不匹配则返回0,即false。!~则相反。


这两个操作符适于条件控制中



也可以用 =~运算符来制定替换目标。


$which  = "this is a test";


$which =~ s/test/quiz/;  
现在$which 是 "this is a quiz";


当然这里的定界符可以改变


$which =~ s~tes~quiz~; 或者$which =~ s<test>{quiz};等等  



还可以这样用:


$p =  "abcdefghijklmn";
if($p =~ s/hijklmn/opq/)


{print "New is :  $p.\n";}
else


{print "failed";}



字符 +  . *和?
+意味着一个或多个相同的字符,如:/de+f/指def、deef、deeeeef等。它尽量匹配尽可能多的相同字符,如/ab+/在字符串abbc中匹配的将是abb,而不是ab。
  *和?与+类似,区别在于*匹配0个、1个或多个相同字符,?匹配0个或1个该字符。如/de*f/匹配df、def、deeeef等;/de?f/匹配df或def。
"." 可以与换行符\n之外的任何单个字符相匹配



字符 []和[^]
[] 意味着匹配一组字符中的一个,如/a[0123456789]c/将匹配a加数字加c的字符串。与+联合使用例:/d[eE]+f/匹配def、 dEf、deef、dEdf、dEEEeeeEef等。^表示除其之外的所有字符,如:/w[^ab]s/不能匹配的was,wbs 。


匹配任意字母或数字
上面提到模式/a[0123456789]c/匹配字母a加任意数字加c的字符串,另一种表示方法为:/a[0-9]c/,类似的,[a-z]表示任意小写字母,[A-Z]表示任意大写字母。任意大小写字母、数字的表示方法为:/[0-9a-zA-Z]/。


锚 描述
^ 或 \A 仅匹配串首
$ 或 \Z 仅匹配串尾
\b 匹配单词边界
\B 单词内部匹配



:/^def/只匹配以def打头的字符串,/$def/只匹配以def结尾的字符串,结合起来的/^def$/只匹配字符串def(?)。

\b在单词边界匹配:/\bdef/匹配def和defghi等以def打头的单词,但不匹配abcdef。/def\b/匹配def和 abcdef等以def结尾的单词,但不匹配defghi,/\bdef\b/只匹配字符串def。
\B在单词内部匹配:/\Bdef/匹配abcdef等,但不匹配def;/def\B/匹配defghi等;/\Bdef\B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。

转义字符 描述 范围
\d 任意数字 [0-9]
\D 除数字外的任意字符 [^0-9]
\w 任意单词字符 [_0-9a-zA-Z]  






_也是单词字符,即任何一个变量名中的有效字符
\W 任意非单词字符 [^_0-9a-zA-Z]
\s 空白 [ \r\t\n\f]
\S 非空白 [^ \r\t\n\f]

Perl模式匹配中匹配指定数目的字符
字符对{}指定所匹配字符的出现次数。
如:/de{1,3}f/匹配def,deef和deeef;
/de{3}f/匹配deeef;
/de{3,}f/匹配不少于3个e在d和f之间;
/de{0,3}f/匹配不多于3个e在d和f之间。




有记忆功能的括号:


()不仅用于Perl正则表达式的编组,也触发匹配引擎的记忆,引擎会将整个匹配段中与括号内Perl正则表达式对应的那部分存入记忆体内。自左边起第一个“(”开始以1编号,在正则表达式中用反斜杠加序号引用匹配。  其变量存在$1,$2,...中
/a(.)b(.)c\2d\1/;  它可以匹配 axbycydx


/i使匹配大小写不敏感

/g无重叠全局替换修饰符

大小写切换:\U此处起至\E全部大写

\L此处起至\E全部小写

\u下一个字母大写

\l下一个字母小写

举例:s/(bush|mandola)/\u\L$1/ig


如果要对所有匹配进行替换而不仅仅是第一个匹配,用g
$which  = "this is a test test";
$which =~ s/test/quiz/g;  
现在$which 是 "this is a quiz quiz";



split把字符串转化为列表,join把列表转化为字符串
有时候,我们需要将一个字符串或一行文本通过某种方式转换为单个的元素存储在数组中,或者将许多元素通过某种分割符,将他们组合成一个字符串。perl刚好就提供了这样的功能,通过split或者join分割或组合元素,下面我们来看一个例子
#! /usr/bin/perl -w
my
$str1
=
"1,2,3,4,5,6,7,8,9,0";
my
@array
=
split(/,/,$str1);
print
"@array\n";
my
$str2
=
join('-',@array);
print
"$str2\n";
程序的执行结果如下:
D:\perl>perl split.pl
1 2 3 4 5 6 7 8 9 0
1-2-3-4-5-6-7-8-9-0
在上面的程序中,我们定义了一个字符串str1,我们想将字符串中连接符“,”替换为“-”。我们首先通过split将字符串中的元素分割开,存储在数组array中,然后再通过join将数组中的元素通过“-”组合为一个新的字符串。
呵呵,这个地方我们只是通过这个例子简单的介绍一个split和join的使用,其实如果你对正则表达式很清楚的话,直接替换就可以了,根本不用这么复杂。
另外我们也可以将这个例子再简化一下,用一条语句来实现:
$str2
=
join('-',split(/,/,$str1));
当然,使用split函数你需要对正则表达式有一点了解,因为split中/,/就是一个正则表达式,通过这个正则表达式来匹配后面的$str1中的分隔符。









转换操作符tr///
的作用与替换运算符有些类似,不过它并不使用正则表达式,而且它的运行方式完全不同。转换操作符的句法如下所示:tr/searchment/repalcement/;是把searchment的第一个字符换成replacement的第一个字符,searchment的第二个字符换成replacement的第二个字符,类推 ~~~~~~~
tr/abd/123/ 将所有出现的a替换成1,所有出现的b替换成2,所有出现的d替换成3.



返回列表