西大 发表于 2017-5-19 08:38:47

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


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


1.     转化



1、语法格式:
  $字符串变量名!~tr/<pattern>/<replacemnt>/
<pattern>为需要替换的匹配模式串,<replacement>为替换的字符串。 把符合 <pattern>模式的字符串转换为 <replacement>。
  2、示例:
  1) 将小写字母全部转成大写
  #perl4-6.pl
  my $zmb="abcde";
  $zmb!~tr///;#将小写转换成大写
  print $zmb;
  输出结果如下:
  ABCDE
  2)  简单加密数字。
  #perl4-7.pl
  #简单加密数字,0加密成e,1加密成f,2加密成g...以此类推
  my $passnum=<stdin>;
  $passnum!~tr///;#将数字转换成字母,实现简单加密
  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对括号匹配到的字串,以此类推。
 
页: [1]
查看完整版本: 神奇的Perl-正则表达式(5)