【问题标题】:RegEx for matching numbers in a string with special patternsRegEx 用于匹配具有特殊模式的字符串中的数字
【发布时间】:2019-05-14 18:28:39
【问题描述】:

我试图找到一个可以进行以下字符串匹配的正则表达式:

我有来自 Windows DNS 服务器调试日志的 DNS 查找,如下所示:

(4)api3(7)central(6)sophos(3)com(0)

为了在我们的 SIEM 解决方案中正确解析,我想执行以下操作:

省略第一个和最后一个(数字)所以我得到:

api3(7)central(6)sophos(3)com

然后将剩余的(数字)替换为 .

如果我只能匹配(数字),我可以用 SIEM 工具中的函数替换它们。

我已经玩过一些正则表达式,但没有找到任何可以让我找到解决方案的东西。我对正则表达式完全陌生,所以也许我遗漏了一些东西。我已经可以用点替换所有(数字),但这很容易。

【问题讨论】:

    标签: regex regex-lookarounds regex-group regex-greedy


    【解决方案1】:

    这个表达式可能满足你的第一个条件:

    (\([0-9]+\))api3(\([0-9]+\))central(\([0-9]+\))sophos(\([0-9]+\))com(\([0-9]+\))
    

    您也可以扩展它并根据需要添加/减少边界,可能类似于以下内容:

    (\([0-9]+\))(api3)\([0-9]+\)(central)\([0-9]+\)(sophos)\([0-9]+\)(com)\([0-9]+\)
    

    然后将其替换为类似于:

    $2.$3.$4.$5
    

    Demo

    正则表达式电路

    您可以在jex.im 中可视化您的表达式:

    JavaScript 测试

    const regex = /(\([0-9]+\))(api3)\([0-9]+\)(central)\([0-9]+\)(sophos)\([0-9]+\)(com)\([0-9]+\)/gm;
    const str = `(4)api3(7)central(6)sophos(3)com(0)`;
    const subst = `$2.$3.$4.$5`;
    
    // The substituted value will be contained in the result variable
    const result = str.replace(regex, subst);
    
    console.log('Substitution result: ', result);

    您当然可以大大简化它。但是,为了安全起见,我添加了限制。


    编辑:

    如果你想捕获第一个和最后一个数字,你可以简单地匹配并替换为expression similar to this

    (\([0-9]+\))(.+)(\([0-9]+\))
    

    然后,你可以简单地用another expression捕获中间的其他人:

     (\([0-9]+\))
    

    【讨论】:

    • 您好,感谢您的全面回答,但这并不是我想要的。我有很多不同的查询需要解析。因此,例如,她是我得到的值列表: (9)1932-ms-7(8)8-7cd110(36)9fb432d2-76ce-11e9-52b3-56ca5906e96d(0) (9)win10-trt( 6)msedge(3)net(0) (9)2012-ms-7(8)8-7cdc2c(36)9631cb56-76ce-11e9-52b3-be39d97995d4(0) (4)api3(7)central(6) sophos(3)com(0) (3)121(2)98(3)253(1)8(7)in-addr(4)arpa(0) 所以字符串有不同的长度。我只需省略第一个和最后一个(数字)并仅捕获剩余的(数字)出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多