perl正则匹配时的环视和命名捕获

perl的正则匹配里有几个有用的匹配方式

1.非捕获型匹配

[perl]
#!/usr/bin/perl
use warnings;
use strict;
my $line="123d4f5g7h8";
if($line=~/(?:5)(\w)/){
print "match $1\n";
}
[/perl]

这样就表示捕获5后面的一个字母或者数字,由于(?:5)是不占用空间的,所以我们还是用$1对捕获的字符串进行引用.

2.命名捕获

[pl]

#!/usr/bin/perl
use warnings;
use strict;
my $line="123d4f5g7h8";
if($line=~/(?:5)(?<var1>\w)/){
print "match $+{var1}\n";
}

[/pl]

我们可以使用(?<NAME>xxx)来把保存匹配的字符串存放在制定的变量里面.引用的时候需要使用$+{NAME}来进行引用.

3.顺序环视

[pl]

(?=xxx)

*******|xxx********

[/pl]

(?=xxx)匹配xxx前面的位置。而(?!xxx)就是匹配除了xxx前面位置的其他所有地方。

4.逆序环视

[pl]

(?<=xxx)

[/pl]

匹配 **********xxx|*********,也就是xxx以后的那个位置,同理(?<!xxx)与(?!xxx)的类似。

另外,在匹配时可以指定的几个常用选项是

/i  忽略字母的大小写

/x  忽略中间的空格  /\d{2}  ([\W]) \d{2} \1 \d{2}/x等价于/\d{2}([\W])\d{2}\1\d{2}/

/s 将串视为单行,”.”可以匹配换行符 。 /a.*bc/s匹配字符串axxxxx \nxxxxbc,但/a.*bc/则不匹配该字符串。

/m  多行匹配。 在此情况下,^符号匹配字符串的起始或新的一行的起始;$符号匹配任意行的末尾。

/o 只编译一次,注意有内插变量的时候谨慎使用

/g 匹配所有可能的模式

此条目发表在Perl Script分类目录。将固定链接加入收藏夹。

发表回复