繁体   English   中英

Perl中的正则表达式任务

[英]Regular expression task in Perl

我有一个关于正则表达式问题的简单问题。

给定以下示例字符串:

Apr 2 13:42:32 sandbox izxp[12000]: Received disconnect from 10.11.106.14: 10: disconnected by user

我需要将此字符串分成4个不同的字符串。 如您所见:日期( Apr 2 ),时间( 13:42:32 ),服务器名称( sandbox )和其他数据( izxp[12000]: Received disconnect from 10.11.106.14: 10: disconnected by user )。

这些将是可变值。

我会很高兴有人可以帮助我!

谢谢!

使用split可以轻松完成此任务。

my ($date1, $date2, $time, $host, $data) = split(' ', $str, 5);
my $date = "$date1 $date2";

对于这类事情,我总是使用所谓的“扫描模式”。 日期的格式非常简单:

/((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d+)

当时的表达并不难

/(\d\d:\d\d:\d\d)/

一旦解决了这个问题,我认为这样指定服务器就很容易了:

/(\w+)/

下一部分就是其他所有内容,因此该模式可以串联在一起:

/((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d+)\s+(\d\d:\d\d:\d\d)\s+(\w+)\s+(.*)/

您可以通过以下表达式将数据存储在Perl中:

my ( $date, $time, $host, $desc ) 
    = $str =~ m/((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d+)
                \s+(\d\d:\d\d:\d\d)\s+(\w+)\s+(.*)
               /x
    ;

请注意,拆分或准备好的正则表达式之间的性能比较(在下面的输出中:re1来自Axeman,而re2简化为/(\\S+ \\S+) (\\S+) (\\S+) (.*)/ ),确认拆分是成功的,但差别很小,在解析的行数少于一百万的情况下,您甚至不会注意到它。 Axeman regexp可以进一步改进,以帮助您证明输入的有效性,这是非常重要的。

10百万次迭代比较:

        Rate  re1  re2  spl
re1 250000/s   -- -28% -57%
re2 344828/s  38%   -- -41%
spl 584795/s 134%  70%   --

以下是古代Core Duo的1亿个通话的摘要:

re1: 40 wallclock secs (39.84usr+0.00sys=39.84CPU) @ 251004.02/s (n=10000000)
re2: 29 wallclock secs (29.04usr+0.01sys=29.05CPU) @ 344234.08/s (n=10000000)
spl: 18 wallclock secs (16.77usr+0.00sys=16.77CPU) @ 596302.92/s (n=10000000)

在这样的记录量下,它看起来很重要。 但是,如果您要在某处检查其余数据字符串的有效性,最好在解析阶段对其进行一次检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM