【问题标题】:Regular Expression Perl正则表达式 Perl
【发布时间】:2012-10-29 21:27:16
【问题描述】:

我正在学习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 的输出?

【问题讨论】:

  • 你不应该把 () 放在 sub 的声明中。

标签: regex perl


【解决方案1】:

split 毫无意义。您不想拆分字符串。你想要:

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

您确实应该在您的模式中包含“-”。 (考虑一下当数字达到 10 时会发生什么。)

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

(如果$val 总是数字,那么\Q..\E 在技术上是不需要的,但这是一个好习惯。)

也就是说,我可能只解析 $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} };

【讨论】:

  • 不过,谢谢 - 使用我的@result = $T2 =~ /-\Q$val\E:(\d+)/;我得到 T= 0,1, T2 -0:0-0:1-0:2-0:3-0:4-1:0-1:1-1:2-1:3- 我们在项目T Rexeg 0 中的 0:(\d)+- T2- 0 我们在 T Rexeg 1 中的项目 1:(\d)+- T2- 0
  • @Vihtorr,我忽略了/g。固定。
【解决方案2】:
  1. 你在1:(\d)+上分手了。第一个匹配元素的左边是什么?你写的字符串。

  2. 你在1:(\d)+上分手了。这个正则表达式的两个匹配之间是什么?破折号。

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

现在,您可以向我们说明您想要达到的目标,然后我们或许可以帮助您一项一项地改正自己。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多