【问题标题】:How can I capture certain data using regex if it is dependent on another field?如果某些数据依赖于另一个字段,如何使用正则表达式捕获某些数据?
【发布时间】:2020-06-22 17:41:51
【问题描述】:

我在为下面提到的日志编写正则表达式时需要帮助:

URLReputation: Risk unknown, URL: http://facebook.com

我写了一个如下的正则表达式:

URLReputation\:\s*(.*?),\s*URL\:\s*(.*)

这里一切正常。但如果 URL 不存在,则 URLReputation 也不会被捕获。

请帮忙。

问候,

米特什·阿格拉瓦尔

【问题讨论】:

  • 当“URL 不存在”时字符串在哪里结束?

标签: regex ruby parsing regex-greedy rubular


【解决方案1】:

您可以将非贪婪的.*? 转换为否定字符类[^,]+ 并匹配除逗号以外的任何字符。然后使用可选的非捕获组 (?:...)? 使 URL 部分可选

您想使用 .* 捕获 url 的值,但这也可能匹配空字符串。

您可以通过匹配至少一个非空白字符\S+ 或使用诸如指定开始https?://\S+ 之类的模式来使模式更具体

URLReputation:\s*([^,]+)(?:,\s*URL:\s*(\S+))?

Regex demo

【讨论】:

    【解决方案2】:

    假设当“URL 不存在”时字符串在逗号之前结束,您可以简单地将逗号和后面的内容放在可选的非捕获组中并添加行尾锚:

    /URLReputation: +(.*?)(?:, +URL:\ +(.*))?$/
    

    Demo

    主要是为了提高可读性,我将每个 \s 更改为一个空格,因为看起来空格是您希望匹配的唯一空白字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-27
      • 2017-05-10
      • 2012-10-22
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2016-11-24
      相关资源
      最近更新 更多