【问题标题】:Stuck on perl regex expression for string with ending white space停留在以空格结尾的字符串的 perl 正则表达式
【发布时间】:2013-03-07 03:37:15
【问题描述】:

以下是 ftp 日志中的一行:

2013-03-05 18:37:31 543.21.12.22 [] 发送 /home/mydomain/public_html/court-9746hd/Chairman-confidential-video.mpeg 226 法庭-9746hd@mydomain.com 256

我正在使用一个名为 Simple Event Correlate 的程序,它从正则表达式的括号内提取值并将这些值设置为变量。

所以,这是 SEC 配置文件中的一个条目,它应该在前一个日志文件行上运行:

    pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)

这成功拉出登录用户court-9746hd,并将其设置为变量,但无法正确提取下载的文件名,或Chairman-confidential-video.mpeg

相反,它会将下载的文件提取为:Chairman-confidential-video.mpeg 226 court-9746hd@mydomain.com 256

所以你看,我很难让第二次提取停止在文件名后面的第一个空格处。我试过了:

    pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)\s

但我只得到相同的结果。任何帮助将不胜感激。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    如果您只想匹配非空格,请将.* 替换为\S*,或者如果空格是您要排除的唯一字符,请改用[^ ]*

    另外,man perlre 是一个很好的参考。

    【讨论】:

      【解决方案2】:

      作为一般规则,不要使用 .* 结构,而是使用范围更窄的东西。在这种情况下,你想要的是不是空白的东西,所以明确地说:

      pattern=sent \/home\/mydomain\/public_html\/([^\s]+)\/([^\s]+)
      

      【讨论】:

        【解决方案3】:

        一种选择是首先从该行捕获完整路径,然后使用File::Spec 获取用户和文件信息:

        use strict;
        use warnings;
        use File::Spec;
        
        my $line = '2013-03-05 18:37:31 543.21.12.22 []sent /home/mydomain/public_html/court-9746hd/Chairman-confidential-video.mpeg 226 court-9746hd@mydomain.com 256';
        my ( $path ) = $line =~ m!\s+(/home\S+)\s+!;
        my ( $user, $file ) = ( File::Spec->splitdir($path) )[ -2, -1 ];
        
        print "User: $user\nFile: $file";
        

        输出:

        User: court-9746hd
        File: Chairman-confidential-video.mpeg
        

        但是,如果您只想使用正则表达式,则可以使用以下方法:

        m!/home/.+/.+/([^/]+)/(\S+)!
        

        【讨论】:

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