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";
}

この問題は、複数の意味を持つ正規表現の括弧に起因します。何を抽出するかを記述し、「or」の境界も記述します。ブラケットなしで 3 番目の正規表現を記述する方法、またはそれらのブラケットを一致しないものとしてマークする方法はありますか?

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 に答える