【问题标题】:Transform Regexp to POSIX BRE将正则表达式转换为 POSIX BRE
【发布时间】:2019-10-28 04:24:12
【问题描述】:

我想将此表达式放入 POSIX BRE。

HTTP\/[\d.]+.\s+(?:403)\s+(4[0-9])\s+

这是我到目前为止的想法。

HTTP\/[0-9.]{1,}.[[:blank:]]{1,}403[[:blank:]]{1,}(4[0-9])[[:blank:]]

使用基于网络的正则表达式检查器,这两个示例都运行良好。 然而,这个正则表达式需要在 SCOM 中注册,而且它似乎只支持 POSIX BRE 来监控 Linux 服务器。

【问题讨论】:

    标签: regex logging scom


    【解决方案1】:

    这是Basic Regular Expressions 上的 Posix 文档。特别要注意:

    1. 当匹配单个字符、子表达式或反向引用的 BRE 后跟格式为 \{m\}\{m,\}\{m,n\} 的区间表达式时,连同该区间表达式,它将匹配BRE 的重复连续出现将匹配......

    所以[[:blank:]]{1,} 不会做你认为它会做的事;大括号前面需要加反斜杠。

    另一方面,大多数 BRE 实现确实允许您使用 \+ 来表示“一个或多个重复”。至少,BSD 和 Gnu 变种可以。因此,您很可能可以将其写为[[:blank:]]\+,而不是使用数字重复运算符[[:blank:]]\{1,\}

    最后,[[:blank:]] 可能不是您想要的。至少,它与\s 不匹配。 [[:blank:]] 仅匹配空格和制表符 ([ \t])。但在大多数正则表达式库中,\s[ \t\r\n\f\v] 相同,这与 C 正则表达式中的 [[:space:]] 匹配(或 C 代码中的 isspace() 函数)。 [[:blank:]]\s(或 [[:space:]])之间最明显的区别是 [[:blank:]] 不匹配换行符。也许这在您的应用程序中没问题。

    学究式注释:一些正则表达式库将\s 定义为[ \t\r\n\f],但您不太可能注意到其中的区别。所有这些字符列表都假定正则表达式已在“C”语言环境中编译。如果正则表达式库支持区域设置并且已启用其他区域设置,则可能会匹配其他字符。

    【讨论】:

    • 感谢您的澄清。我应该提到 SCOM Linux 代理正在监视部分 HTTP/1.1" 403 48 的 nginx 日志文件(其中错误代码 403 后面的数字是 40-49 范围内的两位数)sometext HTTP/1.1" 403 48 "-" "一些文本"
    • 另外,() 需要反斜杠,另一方面,不需要反斜杠 /(除非您的工具使用文字斜杠作为宿主语言中的正则表达式分隔符语法,例如)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2017-11-23
    • 2011-10-02
    • 2016-04-02
    • 1970-01-01
    • 2019-05-11
    • 2014-11-08
    相关资源
    最近更新 更多