定义可重用的正则表达式

时间:2013-05-29 04:03:27

标签: regex perl

我已经定义了一个可重复使用的正则表达式来匹配某个字符串,该字符串以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他们需要用3美元替换2美元,即他们需要知道并记住我的正则表达式包含括号

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

问题来自正则表达式中具有多于1个含义的括号。他们描述了要提取的内容以及他们还描述了“或”的边界。有没有办法在没有括号的情况下编写我的第三个正则表达式,或者将这些括号标记为不匹配?

1 个答案:

答案 0 :(得分: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