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

并根据索引 ($T) 将 $T2 的值解析为数组

但正在显示以下内容

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 一次。

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)+。这个正则表达式的两个匹配之间是什么?破折号。

你分手了1:(\d)+。这意味着,您将字符串切成部分,并使用正则表达式的结果作为分隔符。使用 () 对整数进行通配使其作为正则表达式匹配出现在全局结果中。

现在,您可以向我们解释您想要达到的目标,然后我们也许可以帮助您一一纠正自己。

于 2012-10-29T21:58:32.800 回答