使用Perl正则表达式返回子字符串

8

我正在尝试使用Perl并努力更好地理解其子字符串/正则表达式功能。

比如说我有一个字符串

[48:31.8] Sent: >33*1311875297587*eval*0*frame[0]*"A"<

想要返回 1311875297587。它的格式总是这样的。我应该如何使用Perl实现这一点?

谢谢


1
描述如何识别感兴趣的部分。数字字符串至少3个数字长吗?从">"后面的第4个字符开始吗?在"*eval"之前的数字呢?等等... - tadmc
4个回答

16

假设 $string 中包含 "[48:31.8]...",则:

my ($number) = $string =~ /\*(\d+)\*eval\*/;

$number如果字符串不匹配,则未定义,否则将包含在"*""*eval*"之间的数字。


我会在输入中使用 split 函数,以 * 作为分隔符,并根据子字符串编号进行解析。这样做不仅更加稳健,而且不像 hack 那样。 - kevlar1818

4
if ($str =~ /\*(\d+)\*/ ) {
    print $1;
}

1
my ($num) = '>33*1311875297587*eval*0*frame[0]*"A"<' =~ /(\d{3,})/;
print $num;

0

就我个人而言,我认为这是一个更加健壮的答案:

while(<STDIN>)
{
    @fields = split(/\*/,$1) if(/(?<=>)([^<>])+(?><)/);
    print "$fields[1]\n";
}

如果需要,这将允许访问您所有的字段,并且不依赖于内在顺序来解析特定的字段。

用任何逐行迭代的方式替换while循环。不过为了测试,请将其作为Perl脚本运行,然后粘贴您的行[48:31.8] Sent: >33*1311875297587*eval*0*frame[0]*"A"<或其他内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接