我希望有人可以提供帮助,这让我发疯了!
我正在尝试修改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
答案 0 :(得分:2)
您可以在第一个(?!www\.)
之后添加(?!http:\/\/www\.)
和\b
个否定前瞻,以排除匹配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
个链接。
ALTERNATIVE :
\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)
(?!(?:https?|ftps?):\/\/)
和(?!www\.)
前瞻只会让您跳过协议和网址的www
部分。
答案 1 :(得分:0)
如果网址以www
开头,则会与www
后的部分匹配。
(?!www\.)\b(?:(?!-)[0-9A-Za-z]{1,63})(?:\.(?:(?!-)[0-9A-Za-z-]{1,63}))*(\.?|\b)
我通过在子域中使用-
的否定前瞻来简化了正则表达式的其余部分。