Perl 的组匹配


从 Perl 中的正则表达式角度来看,除了前者更清晰以外,以下两个表达式之间没有区别。

$string =~ /(\S+)\s+(\S+)/;
and
$string =~ /\S+\s+\S+/;

然而,分组的优点是可以让我们从正则表达式中提取一个序列。分组以其在原始表达式中的出现顺序作为列表返回。例如,在下例中,我们已经从字符串中提取出小时、分钟和秒。

my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);

除了这种直接方法以外,匹配到的分组还可以通过特殊的 $x 变量获得,其中 x 是正则表达式中分组的编号。因此,我们可以按如下方式重写前面的示例 −

示例

 演示

#!/usr/bin/perl
$time = "12:05:30";
$time =~ m/(\d+):(\d+):(\d+)/;
my ($hours, $minutes, $seconds) = ($1, $2, $3);
print "Hours : $hours, Minutes: $minutes, Second: $seconds\n";

当执行以上的代码段时,会输出以下结果 −

Hours : 12, Minutes: 05, Second: 30

当在替换表达式中使用分组时,可以在替换文本中使用 $x 语法。因此,我们可以使用以下方式重新格式化日期字符串 −

示例

 演示

#!/usr/bin/perl
$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;
print "$date\n";

当执行以上的代码段时,会输出以下结果 −

1999/03/26

更新日期:2019 年 11 月 29 日

超过 2000 次浏览

开启您的 职业

通过完成此课程获得认证

开始
广告