正则表达式:1美元没有获得正确的数据,如何做到正确?

时间:2014-03-12 13:40:01

标签: regex perl

while (<DATA>)
{print  "$1" if /((?:\d+)(?:\s*)){5}/;}

数据

12 14 43 43 41  
35 43 543 63 63

输出:4163

我想知道为什么输出不是$1

2 个答案:

答案 0 :(得分:2)

  

我想知道为什么输出不是$1

双引号字符串插入变量。如果您需要$1,则可以使用print '$1';


$1包含捕获的最近成功的正则表达式匹配的第一次捕获。

让我们检查以下类似的程序,这是对当前OP中的程序的简化。

while (<DATA>) {
   print $1 if /(\d+\s*){5}/;
}

__DATA__
12 14 43 43 41  
35 43 543 63 63

对于while循环的第一次传递,最后一次只在正则表达式中捕获匹配,它捕获41后跟换行符。然后由print "$1"打印。

对于while循环的第二次传递,最后一次匹配正则表达式中的唯一捕获,它捕获63后跟换行符。然后由print "$1"打印。

因此,输出是

41
63

如果您希望输出

12 14 43 43 41  
35 43 543 63 63

你可以做到

print $1 if /((?:\d+\s*){5})/;

或者你可以做到

print $_ if /(?:\d+\s*){5}/;

答案 1 :(得分:0)

听起来像是Regexp::Debugger的工作。

但如果你告诉我们你想得到什么结果,那么帮助你会更容易。