此Perl正则表达式中$ 1和$ 2的目的:s / ^([^,] +,)ab。([^,] +,)(?:[^,] +,)/ $ 1 $ 2 /

时间:2009-09-24 11:40:25

标签: regex perl

任何人都可以建议我下面Perl正则表达式的含义:

$_ =~ s/^([^,]+,)ab.([^,]+,)(?:[^,]+,)/$1$2/;

$1$2的作用是什么以及如何定义这些变量?

2 个答案:

答案 0 :(得分:10)

正则表达式意味着:

^          Start of string
(          Start of capturing group -> $1
 [^,]+     Any character except ",", one or more times
 ,         A literal ","
)          End of capturing group
ab         "ab"
.          Any character
([^,]+,)   Same as previously -> $2
(?:        Start a non-capturing group
    [^,]+, Same as previously
)          End group

每个捕获组按照它们在RegEx中出现的顺序放入编号变量

答案 1 :(得分:6)

$ 1和$ 2变量是匹配变量。

在正则表达式中,当某些东西被括号括起来时,正则表达式的那部分(如果匹配)将存储在$ n变量中。

所以例如:/(\ d +),(\ w +)/会匹配123,xyz,123分配给$ 1,xyz分配$ 2。它们按照它们出现在正则表达式中的顺序分配。

请注意,在前导括号后面的“?:”即(?:...),告诉正则表达式不将该匹配值保存在$ n变量中。

以下示例代码演示了正则表达式使用Perl执行的操作。请注意,您的问题中的正则表达式中缺少前导s(替换)。

文件:test.pl

#!/usr/bin/perl

print $ARGV[0], "\n";
$ARGV[0] =~ s/^([^,]+,)ab.([^,]+,)(?:[^,]+,)/$1$2/;
print "\$1 = $1\n";
print "\$2 = $2\n";
print $ARGV[0], "\n";

<强>执行:

%> ./test.pl str1,ab.str2,str3,str4,
str1,ab.str2,str3,str4,
$1 = str1,
$2 = str2,
str1,str2,str4,