我已经查看并尝试了多个其他线程,但对我来说不起作用。我需要regex解决方案才能工作,而且没有没有regex的java代码。
我已经检查过的一些线程:从给定的url中获取域名,从url字符串中提取主机名/域名,并使用Java正则表达式提取域名?没有一个对我有用,要么正则表达式不起作用,要么解决方案是没有正则表达式的java代码。
我想做什么?
Case 1:
Input: https://api.twitter.com/blog/category/2?user=42&status=enabled
Output: api.twitter.com
Input: abc.xyz.com/blog/category/2?user=42&status=enabled
Output: abc.xyz.com
Case 2:
Input: https://abc.xyz.com/blog/category/2?user=42&status=enabled
Output: xyz.com
Input: abc.xyz.com/blog/category/2?user=42&status=enabled
Output: xyz.com
我需要2个正则表达式来解决上面提到的每个情况。如果它能在一个地方完成,即使这样也能奏效。
我在第一篇文章中尝试了以下正则表达式:
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?
当存在https://
或任何方案时,此方法有效,但当URL中没有方案时失败。
到目前为止,我正在使用两步解决方案来解决第一个案例。
Step 1: Replace scheme
(.*://)(.*) -> $2
remove anything before and including string "://"
Step 2: Extract host name
([^/]*)(.*) -> $1
The first group extracts everything that is before the first "/". Basically extracting everything that isn't slash till I see the first one.
您可以将此正则表达式与可选匹配和捕获组一起使用:
^(?:w+://)?((?:[^./?#]+.)?([^/?#]+))
RegEx演示
RegEx详细信息:
^
:启动(?:w+://)?
:可选择匹配方案名称后跟://
(
:启动捕获组#1(?:[^./?#]+.)?
:可以选择使用非捕获组匹配域名的第一部分([^/?#]+)
:匹配捕获组#2中非/
、?
、#
的任何字符的1+
)
:结束捕获组#1