0

私はperlで正規表現を学んでいますが、次のような関数が欲しいです。

sub RegEx() 
{
  my $T = "0,1,";
  my $T2 = "-0:0-0:1-0:2-0:3-0:4-1:0-1:1-1:2-1:3-";

  printf ("T= %s <br>", $T);
  printf ("T2 %s <br>", $T2);

  my @values = split(',', $T);
  foreach my $val (@values) {
         printf ("We are at item %s in T <br>", $val);
         my $temp = $val .":" . "\(\\d\)\+";
         printf ("Rexeg %s <br>",$temp);
         @result = split(/$temp/, $T2);
         foreach my $val2 (@result) {
                printf ("T2- %s <br>", $val2);
         }
   }
}

$ T2の値をインデックス($ T)に基づいて配列に解析します

しかし、以下が表示されています

T= 0,1 
T2 -0:0-0:1-0:2-0:3-0:4-1:0-1:1-1:2-1:3- 
We are at item 0 in T 
Rexeg 0:(\d)+ 
T2- - 
T2- 0 
T2- - 
T2- 1 
T2- - 
T2- 2 
T2- - 
T2- 3 
T2- - 
T2- 4 
T2- -1:0-1:1-1:2-1:3- 
We are at item 1 in T 
Rexeg 1:(\d)+ 
T2- -0:0-0:1-0:2-0:3-0:4- 
T2- 0 
T2- - 
T2- 1 
T2- - 
T2- 2 
T2- - 
T2- 3 
T2- - 

なぜ私がまだ見ているのか教えてください

  1. T2- -0:0-0:1-0:2-0:3-0:4-正規表現が1:(\ d)+の場合

  2. 「-」

@resultsの出力として?

4

2 に答える 2

2

split意味がありません。文字列を分割したくありません。あなたが欲しい:

my @result = $T2 =~ /$temp/g;

あなたは本当に-あなたのパターンに""を含めるべきです。(数字が10になったらどうなるか考えてみてください。)

my @result = $T2 =~ /-\Q$val\E:(\d+)/g;

(常に数字になる\Q..\E場合は技術的には必要ありませんが$val、それは良い習慣です。)

そうは言っても、私はおそらく$T2を1回だけ解析するでしょう。

my $T2 = "-0:0-0:1-0:2-0:3-0:4-1:0-1:1-1:2-1:3-";
my %T2; push @{ $T2{$1} }, $2 while $T2 =~ /-(\d+):(\d+)/g;
...
my @result = @{ $T2{$val} };
于 2012-10-29T21:41:29.233 に答える
0
  1. あなたはで分割し1:(\d)+ます。最初に一致する要素の左側には何がありますか?あなたが書いた文字列。

  2. あなたはで分割し1:(\d)+ます。この正規表現の2つの一致の間には何がありますか?ダッシュ。

あなたはで分割し1:(\d)+ます。つまり、文字列をパーツにカットし、正規表現の結果をセパレータとして使用します。整数()を使用してグロブすると、グローバル結果に正規表現の一致として表示されます。

今、あなたはあなたが達成したいことを私たちに説明することができます、そしてそれから私たちはあなたがこれをあなた自身で修正するのを手伝うことができるかもしれません。

于 2012-10-29T21:58:32.800 に答える