【问题标题】:Regex remove www from URL正则表达式从 URL 中删除 www
【发布时间】:2016-05-06 10:42:37
【问题描述】:

希望有人能帮忙,这让我发疯了!

我正在尝试修改 Logstash Grok 过滤器以解析域名。 目前正则表达式是: \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b) 并正确分隔域但是,我需要添加额外的检查以删除 www.

这是我目前想出的:

\b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(^(?<!www$).*$?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)

我似乎只能保留域的www. 部分,而不是域本身。 我需要实现的示例: www.stackoverflow.com 应该是 stackoverflow.com

我需要专门删除 www. 而不是整个子域。

提前谢谢你!

更新

预期输出的示例输入(以这篇文章为例): 在它的当前状态下: https://stackoverflow.com/questions/37070358/ 返回www.stackoverflow.com

我需要它返回stackoverflow.com

【问题讨论】:

标签: regex logstash grok


【解决方案1】:

您可以在第一个\b 之后添加(?!www\.)(?!http:\/\/www\.) 否定前瞻,以排除匹配的www.http://www.

\b(?!www\.)(?!http:\/\/www\.)(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(?:\.?|\b)
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^

regex demo

您可以添加更多否定前瞻来排除 https://ftp/ftps 链接。

替代方案

\b(?!(?:https?|ftps?):\/\/)(?!www\.)(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(?:\.?|\b)

this regex demo

(?!(?:https?|ftps?):\/\/)(?!www\.) 前瞻只会让您跳过 URL 的协议和 www 部分。

【讨论】:

  • 在域名前没有'http/https://'的情况下可以工作......不幸的是,大多数域名都包含它。
  • 没问题:\b(?!www\.)(?!http:\/\/www\.)(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(?:\.?|\b)
  • 非常感谢!!完美运行!
  • 我忘记了我正在使用前瞻,其中图案可以是无限宽度。我添加了一个更全面的替代方案。
  • 再次感谢您。以前的工作,但我将其更改为替代。
【解决方案2】:

如果url以www开头,这将匹配www之后的部分。

(?!www\.)\b(?:(?!-)[0-9A-Za-z]{1,63})(?:\.(?:(?!-)[0-9A-Za-z-]{1,63}))*(\.?|\b)

我还通过在子域中对- 使用负面展望来简化了您的正则表达式的其余部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 2017-08-24
    • 2020-07-12
    • 2017-11-29
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多