欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

神奇的Perl-正则表达式(5)

程序员文章站 2022-04-29 16:24:25
...

声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载

1.     转化

1、语法格式:

$字符串变量名!~tr/<pattern>/<replacemnt>/

<pattern>为需要替换的匹配模式串,<replacement>为替换的字符串。 把符合 <pattern>模式的字符串转换为 <replacement>。

2示例:

1) 将小写字母全部转成大写

#perl4-6.pl

my $zmb="abcde";

$zmb!~tr/[a-z]/[A-Z]/;#将小写转换成大写

print $zmb;

输出结果如下:

ABCDE

2)  简单加密数字。

#perl4-7.pl

#简单加密数字,0加密成e1加密成f2加密成g...以此类推

my $passnum=<stdin>;

$passnum!~tr/[0-9]/[e-n]/;#将数字转换成字母,实现简单加密

print "\n";

print $passnum;

运行后,我们随意输入一串数字:834235902

输出简单加密的信息:mhighjneg

1.     捕捉正则变量

我们使用模式串匹配字符串时,有时需要捕捉匹配到的字符串。

 

 

2.1         使用数字反引用捕捉

使用$数字的形式表示匹配到的正则变量,括号匹配顺序为匹配模式串从左至右。$1代表第1对括号匹配到的字串,$2代表第2对括号匹配到的字串,$3代表第3对括号匹配到的字串,以此类推。

 

use 5.010;

my $names='deep and future';

if ($names=~m/(\w+)  (and|or)  (\w+)/){

    #2(\w+)分别匹配and前和and后的字符串(不包括空格)

say "我获得了$1 and $3";

# future$2匹配,因为一个括号代表可捕捉位置,#$2模式串为and|or

}

输出: 我获得了 deep and future

再看一个更复杂的例子:

#perl4-8.pl

use 5.010;

my $names='Hello,Beijing';

if ($names=~m/(\w+)(,)(\w+)/){

    #2(\w+)分别匹配逗号前和逗号后的字符串(不包括空格),匹配位置分别为$1$3

say "我获得了$1 and $3"; #$1 Hello ,$3 Beijing

}

#注意下面这次匹配,我们把逗号前的字符串和逗号放在一对括号内

if ($names=~m/((\w+)(,))(\w+)/){

    #我们从左到右开始解读模式串((\w+)(,))(\w+)

    #首先遇到一个左括号,我们找到它对应的右括号

    #发现遇到的第一对括号内容为 ((\w+)(,))

    # 接着寻找遇到的第二对括号 (\w+)

    #然后是第三对括号 (,)

    #最后是第四对括号 (\w+)

say "我获得了$2 and $4"; #$2 Hello ,$4 Beijing

}

输出结果如下:

我获得了Hello and Beijing

我获得了Hello and Beijing

使用$数字的形式表示匹配到的正则变量,括号匹配顺序为匹配模式串从左至右。$1代表第1对括号匹配到的字串,$2代表第2对括号匹配到的字串,$3代表第3对括号匹配到的字串,以此类推。