3

我已经定义了一个可重用的正则表达式来匹配以单词 demux 后跟数字开头的某个字符串

my $regexDemux = 'demux\d+';

和一个匹配以 ae 开头的单词

my $regexAe = 'ae\d+';

这些效果很好,可以根据需要在我的应用程序中重复使用。当我想定义一个匹配其中任何一个的正则表达式时,问题就来了

my $regexDemuxOrAe = '(demux|ae)\d+';

这可行,但它要求我的正则表达式的使用者知道它包含括号,并且它将对 $1、$2 等产生影响。例如,在第一个示例中,他们可以这样做:

if('demux123-demux456' =~ /($regexDemux)-($regexDemux)/)
{
  print "$1  $2";
}

但要匹配 demux 或 ae,他们需要将 $2 替换为 $3,即他们需要知道并记住我的正则表达式包含括号

if('ae01-demux02' =~ /($regexDemuxOrAe)-($regexDemuxOrAe)/)
{
  print "$1  $3";
}

问题来自正则表达式中的括号具有超过 1 个含义。它们描述了要提取的内容,还描述了“或”的边界。有什么方法可以编写没有括号的第三个正则表达式,或者将这些括号标记为不匹配?

4

1 回答 1

4
my $regexDemuxOrAe = qr/(?:demux|ae)\d+/;

?:将使括号聚集但不捕获(无反向引用)。

请注意,您可能希望通过运算符获得一流的正则表达式对象qr//,而不是字符串。

例子:

$ perl -E '$re = qr/(?:demux|ae)\d+/;
> print "$1 $2" if $ARGV[0] =~ /($re)-($re)/' ae01-demux02
ae01 demux02
于 2013-05-29T04:07:03.730 回答