如果依赖于另一个字段,我如何使用正则表达式捕获某些数据?

How can I capture certain data using regex if it is dependent on another field?

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

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

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

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

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

请帮忙

此致,

Mitesh Agrawal

你可以把非贪婪的 .*? 变成否定字符 class [^,]+ 并匹配除逗号之外的任何字符。然后使用可选的非捕获组 (?:...)?

使 URL 部分可选

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

您可以通过匹配至少一个非空白字符 \S+ 或使用例如指定开始 https?://\S+

的模式来使模式更具体
URLReputation:\s*([^,]+)(?:,\s*URL:\s*(\S+))?

Regex demo

假设当 "URL isn't there" 时字符串在逗号之前结束,您可以简单地将逗号和后面的内容放在一个可选的非捕获组中并添加一个行尾锚点:

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

Demo

主要是为了提高可读性,我将每个 \s 更改为 space,因为 space 似乎是您希望匹配的唯一白色 space 字符。