【问题标题】:Recursive Regex, capture same text under two different tags递归正则表达式,在两个不同的标签下捕获相同的文本
【发布时间】:2016-05-12 21:04:01
【问题描述】:

我希望使用正则表达式解析一些文本,并且我需要能够在两个不同的标签下抓取相同的文本,同时只在第二个标签上的某个字符之前捕获文本。这是我试图引入的文本示例。

Reputation=High risk ProtocolP=SSL client Web_Application=YouTube URL=https://youtube.com

这是我目前写的正则表达式。

^Reputation=(?<rep>.*?)\sProtocol=(?<prot>.*?)\sWeb_Application=(?<webapp>.*?)\sURL=(?<url>[http|https].*?)\sSource_IP=(?<sip>.*?)\s

这得到了我最初需要的东西,但我需要为 URL 部分添加第二个标签以仅获取域名。例如,只有https://youtube.com

当然,如果域恰好是 https://m.youtube.com,那么它也应该被捕获。

有没有办法做到这一点?

【问题讨论】:

  • Reputation=High risk ProtocolP=SSL client Web_Application=YouTube URL=https://youtube.com 这是原始数据。不,很遗憾我没有 XML 片段解析能力。
  • 尝试将URL=(?&lt;url&gt;[http|https].*?) 更改为URL=(?&lt;url&gt;(?:http|https)://(?&lt;domain&gt;[^/]+).*?)。见regex101.com/r/pB0tN7/1
  • 不幸的是,由于某种原因,这不起作用。我有这种作品有时URL=(?&lt;url&gt;https?://(?&lt;domain&gt;[^/s]+)(?:/[^s]+)?)\s+ 问题是它在捕获的内容中非常受欢迎。有时它会同时获取 URL 和域,有时什么都没有。 https:// 在域名后面的 / 后面什么都没有,或者有时它的 http:// 在域名后面的 / 后面什么都没有。我不确定如何保证每次都捕获 URL 和域
  • 试试URL=(?&lt;url&gt;https?://(?&lt;domain&gt;[^/\s]+)(?:/[^\s]+)*) - 您在s 之前省略了\,并且您需要在第一个否定字符类中使用/
  • 这正是我想要的。这就像一个冠军!非常感谢。

标签: regex


【解决方案1】:

您可以将URL匹配部分替换为URL=(?&lt;url&gt;https?://(?&lt;domain&gt;[^/\s]+)(?:/[^\s]+)*)

Reputation=(?<rep>.*?)\sProtocolP=(?<prot>.*?)\sWeb_Application=(?<webapp>.*?)\sURL=(?<url>https?://(?<domain>[^/\s]+)(?:/\S+)*)\sSource_IP=(?<sip>.*?)\s

regex demo

  • https?:// - 匹配 http://https://
  • (?&lt;domain&gt;[^/\s]+) - 域匹配部分,除 / 和空格之外的 1+ 个字符
  • (?:/\S+)* - 0+ 个/ 序列后跟 1+ 个字符(空格除外)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多