如何从perl中更改字符串中提取值

时间:2016-11-07 12:34:41

标签: regex perl

我想从字符串中提取一个值(不断变化)以便进一步处理。

字符串是

TPSM seed 4339CD65   pass 1  x 0 x 1  errors 0 pid 179947 rulefilecycle 0
TPSM seed 5339CD60   pass 1  x 9 x 2  errors 0 pid 179947 rulefilecycle 0
TPSM seed 2339CD61   pass 1  x 101 x 5  errors 0 pid 179947 rulefilecycle 0
TPSM seed 5339CD65   pass 1  x 19 x 6  errors 0 pid 179947 rulefilecycle 0
TPSM seed 9339CD65   pass 1  x 100 x 7  errors 0 pid 179947 rulefilecycle 0

我想提取1 x a x n 形式的传递之后的值,其中我感兴趣的是' n' 。 我正在尝试在perl中使用substr(),但由于数字不断变化,我无法写出像 substr($ string,37,1)这样的东西。

如果没有某些正则表达式的substr(),我怎么能实现这个目的?

3 个答案:

答案 0 :(得分:5)

怎么样:

my ($n) = $string =~ /pass\s+\d+\s+x\s+\d+\s+x\s+(\d+)/;

<强>解释

/         : Regex delimiter
pass      : literally pass
\s+\d+\s+ : 1 or more spaces, 1 or more digits, 1 or more spaces (ie. the first number)
x         : literally x
\s+\d+\s+ : 1 or more spaces, 1 or more digits, 1 or more spaces (ie. the second number)
x         : literally x
\s+       : 1 or more spaces
(\d+)     : 1 or more digits, captured in group 1 (ie. the third number)
/         : regex delimiter

如果正则表达式匹配$string,则在组1中捕获第三个数字,然后使用此组中的值填充变量$n

如评论中所述,它可以简化为:

my ($n) = $string =~ /pass(?:\s+\d+\s+x){2}\s+(\d+)/;

(?:...)是非捕获组。

答案 1 :(得分:0)

你可以试试这个:

while(<DATA>)
{
    printf "%s\n", ($_=~m/\s*x\s*(\d+)\s*errors\s0/i)[0];
}


__DATA__
TPSM seed 4339CD65   pass 1  x 0 x 1  errors 0 pid 179947 rulefilecycle 0
TPSM seed 5339CD60   pass 1  x 9 x 2  errors 0 pid 179947 rulefilecycle 0
TPSM seed 2339CD61   pass 1  x 101 x 5  errors 0 pid 179947 rulefilecycle 0
TPSM seed 5339CD65   pass 1  x 19 x 6  errors 0 pid 179947 rulefilecycle 0
TPSM seed 9339CD65   pass 1  x 100 x 7  errors 0 pid 179947 rulefilecycle 0

答案 2 :(得分:0)

您也可以使用split

默认情况下,split将在/\s+/上拆分,然后您可以像访问数组一样访问所需的元素:

use warnings;
use strict;
use feature qw / say /;

while(<DATA>){
    chomp;
    my $num = (split)[8];
    say $num;
}