【问题标题】:regex capture group which might not be present可能不存在的正则表达式捕获组
【发布时间】:2017-09-08 09:12:41
【问题描述】:

我正在通过一些日志文件运行正则表达式。 捕获组应捕获一些相关字段。 我想知道日志文件是否提到了工作的成功结束。这可以通过字符串“作业执行成功”的存在与否来判断

到目前为止我的正则表达式: ^Job started at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+orderno\s+-\s+'(\w+)'\s+runno\s+-\s+'(\d+)'[\s\S]+Host1\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)' - Host2\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)'[\s\S]+(Job executed successfully)?[\s\S]+Job ended at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+Elapsed time\s\[([\d.]+)sec\]\sCPU usage\s\[([\d.]+)sec]

(我对正则表达式有点陌生,所以它根本不完美,需要一些强化)

成功结束的示例日志: 上面的正则表达式只有在“(作业执行成功)?”后面的问号才有效。已删除,我认为这不是必需的。

作业开始于 '0902 23:56:00:367' orderno - '0tzh0' runno - '00064' 转移次数 - 1

Host1 'Local'[Windows-LOCAL] 用户名'xxx\xxx' - Host2 'xxx.xxx.xx'[Unix-SFTP] 用户名'xxx'

本地主机是:xxx - Windows 200x [601] Service Pack 1 build 7601 - Intel64 Family 6 Model 37 Stepping 1, GenuineIntel

********** 开始传输 #1 out of 1 *************** 转移 #1 成功完成

作业成功执行。退出。

作业结束于“0902 23:56:07:138” 已用时间 [7 秒] CPU 使用率 [0.15 秒]

未成功结束的示例日志: 上面的正则表达式就像它应该的那样工作。

作业开始于 '0831 15:26:00:365' orderno - '0tuq5' runno - '00030' 转移次数 - 4

Host1 'Local'[Windows-LOCAL] 用户名'xxx\xxx' - Host2 'xxx.xxx.xx'[Unix-SFTP] 用户名'xxx'

本地主机是:xxx - Windows 200x [601] Service Pack 1 build 7601 - Intel64 Family 6 Model 37 Stepping 1, GenuineIntel

********** 开始传输 4 次中的第 1 次 ****************** 无法连接到“xxx.xxx.xx”上的 SSH 服务器:SFTP_Connect:psftp_connect 失败:ssh_init:网络错误:连接超时 .

无法建立与主机 sftp.onenet.be 的连接

作业结束于 '0831 15:26:21:426'

经过的时间 [21 秒] CPU 使用率 [0.0 秒]

【问题讨论】:

    标签: regex logfile capturing-group


    【解决方案1】:

    只需对您的正则表达式进行少量更改,您就可以使用这个:

    ^Job started at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+orderno\s+-\s+'(\w+)'\s+runno\s+-\s+'(\d+)'[\s\S]+?Host1\s'([\w.]+)'\[([\w-]+)\] username '([\w\\]+)' - Host2\s'([\w.]+)'\[([\w-]+?)\] username '([\w\\]+)'[\s\S]+?(?:(Job executed successfully)[\s\S]+?)?Job ended at\s'(\d+\s\d+:\d+:\d+:\d+)'\s+Elapsed time\s\[([\d.]+)sec\]\sCPU usage\s\[([\d.]+)sec]
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^^^-----------------------------------^^
    

    (上面^表示的主要变化)

    我还将一些量词转换为惰性,这应该会使事情变得更快。

    regex101 demo

    由于[\s\S]+ 的贪婪匹配和回溯(从右到左)并测试(Job executed successfully)?[\s\S]+,您当前的正则表达式将匹配所有内容直到最后,[\s\S]+ 将在Job ended 获取后立即匹配找到了。

    在上述方式中,我们从左到右检查每个字符,直到找到我们需要的部分,即Job executed successfully,如果它存在。

    【讨论】:

      【解决方案2】:

      如果你使用PCRE,你可以使用美妙的\Q...\E 序列和一个否定。前瞻:

      ^\QJob started\E
      (?:(?!\QJob ended\E).)+?
      ^\QJob executed successfully\E
      

      参见a demo on regex101.com(注意multilineverbosesingleline 修饰符!)。

      如果不是,整个表达式就会变得有些不可读:

      ^Job started(?:(?!Job ended).)+?^Job executed successfully
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        相关资源
        最近更新 更多