码迷,mamicode.com
首页 > 其他好文 > 详细

perl: 正则表达式

时间:2015-04-23 17:26:30      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:perl

正则表达式:

正则表达式在perl叫模式,是一个匹配某字符串的模板。

perl的正则表达式和shell/awk/sed/grep的差不多。

 

m/pattern/       运算模式匹配:

/pattern/就是m/pattern/的简写,

定界符//可以换成别的符号([{<#$%等等,

如果用//开头的m可以省略,其他符号m不能省略。

定界符应该选择模式中不会出现的字符。

 

Perl中的正则表达式的修饰符:

/pattern/i     用i来匹配不用区分大小写。

/pattern/s     用s来匹配任意字符。

/pattern/x    用x来表示可以在模式中随意加上空白:

Pattern中的空白都回被忽略,可以用\s来匹配空白。

Perl中的注释也是空白。

 

if   (m{

    Pattern1   #comment1

    Pattern2   #comment2

}six) {

    …

}

 

Perl的反向引用:

\n 表示对哪个分组的引用,分组数为//中的左括号的位置。

/(.)\1/    表示匹配连续出现的两个同样的字符,\1是对第一组的引用。

/x(...)y1\/   表示x之后的三个字符在y之后再出现一次,也就是x...y...

/x(.)(.)\2\1/   分别对第一组和第二组的引用,\2表示对第二个分组的引用。

/x((.)(.)\3\2)y\1/   用到了三个分组。

 

新版perl可以使用反向引用:

\g{N}   用N表示哪个分组。

 

默认的匹配对象是$_。

“string” =~   /pattern/   #使用=~绑定操作符指定匹配的对象。

$res = <STDIN> =~/pattern/;    #如果匹配到$res=1,否则为空

 

捕获变量:

$n 用来表示 /pattern/ 中从左到右第n个括号中的内容。

$n这些捕获变量只有在下次匹配成功时才会被重置。

(?:pattern)使用?:表示这个括号不捕获,只是分组,$n不计数。

if ($str =~ /pattern/) {

    my $match = $1;    #将捕获的字符串保存起来以便以后使用。

} else {

    …         #如果匹配失败,$n保存的还是上次的值。

}

 

新版perl可以使用命名捕捉:

加标签的方法   /(?<LABEL>PATTERN) /

捕捉的结果进入特殊哈希%+

键:标签 , 值:就是捕捉的字符串。

LABEL自己命名,访问的值为$+{LABEL}

新版的反向引用还可以用: \g{LABEL} 等效于 \k<LABEL>

 

自动匹配变量:

$& 用来存放/pattern/里实际匹配到的部分。

$` 用来存放匹配起始位置之前的字符串。

$‘   保存了字符串中从来没有被匹配到的部分。

 

while (<>) {

    chomp;

    if (/YOUR_PATTERN_GOES_HERE/) {

        print “Matched:|$`<$&>$‘|\n”;

    } else {

        print “No match: |$_|\n”;

    }

}

 

s/pattern1/pattern2/   运算替换操作:

s/pattern1/pattern2/;         #用pattern2替换掉pattern1匹配到的内容。

s///   替换成功返回真,否则返回假。

s操作的的定界符也可以是任意字符。

s#pattern1#pattern2#;

s{pattern1}{pattern2};

s[pattern1]<pattern2>;

 

s替换操作的修饰符:

s/pattern1/pattern2/g;    #g表示全局替换。

s/^\s/+|\s+&//g;    #去掉开头和结尾的空白。

i    表示不去分大小写

s    表示匹配任意字符。

m   可以匹配行内的换行符

 

s操作的默认字符串也是$_,还可以绑定操作符:

$filename =~ s#^.*/##s;    #去掉路径获取文件名

 

大小写转换:

下面操作适用于双引号内的字符串。

s/pattern1/\Upattern2/;    #将pattern2转换成大写。

s/pattern1/\Lpattern2/;    #将pattern2转换成小写。

s/pattern1/\Upattern2\Epattern3/;    #只将pattern2转换成大写。

s/pattern1/\Lpattern2\Epattern3/;    #只将pattern2转换成小写。

s/pattern1/\upattern2/;    #将pattern2的第一个字符大写。

s/pattern1/\lpattern2/;    #将pattern2的第一个字符小写。

 

贪婪量词:

尽可能匹配更多

*

+

{n}

{n,}

{n,m}

 

非贪婪量词:

尽可能匹配更少

*?

+?

??

{n}?

{n,}?

{n,m}?

 

一次更新多个文件:

$^I    表示备份文件的扩展名。

 

在命令行进行编辑:

perl   -p  -i.bak   -w   -e  ‘s/pattern1/pattern2/g‘  fred*.dat

将所有fred*.dat文件中的pattern1全部改成pattern2,备份文件为*.bak.

 

~~  智能匹配:

use    5.010;

智能匹配优先级:

%a ~~ %b

%a ~~ @b

%a ~~ /Fred/

%a ~~ ‘Fred’

@a ~~ @b

@a ~~ /Fred/

@a ~~ 123

@a ~~ ‘Fred’

$name ~~ undef

$name ~~ /Fred/

123 ~~ ‘123.0’

‘Fred’ ~~ ‘Fred’

123 ~~ 456

 

自动在hash中匹配键:

say “I found a key matching‘Fred’.\n”

    if  %name   ~~   /Fred/;

 

比较两个数组大小:

say “The array have the sameelements!\n”

    if   @arr1    ~~    @arr2;

 

判断结果是否在集合中:

say “Ths $result is one ofthe input values @nums!\n”

    if @nums  ~~   $result;

 

split   /PATTERN/[, EXPR,LIMIT]]:

将模式作为分隔符拆分字符串到列表中,返回列表或列表长度,

split会保留开头的空白,忽略结尾的空白,

split默认用空白分割$_.

my@arr = split;   # ==   split /\s+/, $_;

 

join    EXPR, LIST:

将字符串expr作为分隔符插入到列表中组成一个新的字符串并返回。

 

pos

quotemeta

study

qr// 

perl: 正则表达式

标签:perl

原文地址:http://blog.csdn.net/wowotouweizi/article/details/45224143

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!