正则表达式从 URL 中删除 www

Regex remove www from URL

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

我正在尝试修改 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.whosebug.com 应该是 whosebug.com.

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

提前致谢!

更新

预期输出的输入示例(以 post 为例): 在它的当前状态: returns www.whosebug.com

我需要的是 return whosebug.com

您可以在第一个 \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 部分。

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

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

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