假设您的正则表达式:
/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
实际上确实解析了 Urls(我还没有检查过),您可以轻松地使用捕获组来获取主机:
/^(https?:\/\/)?(?<host>([\da-z\.-]+)\.([a-z\.]{2,6}))([\/\w \.-]*)*\/?$/
当您得到Match
结果时,您可以检查Groups["host"]
以获取主机名。
但是在我看来,你最好只使用Uri.TryCreate,尽管你需要一些逻辑来解决可能缺少方案的问题。那是:
if (!Regex.IsMatch(line, "https?:\/\/"))
line = "http://" + line;
Uri uri;
if (Uri.TryCreate(line, UriKind.Absolute, out uri))
{
// it's a valid url.
host = uri.Host;
}
解析网址是一项非常棘手的工作。例如,单个虚线段不能超过 63 个字符,并且没有什么可以阻止最后一个虚线段包含数字或连字符。也不限于 6 个字符。最好将整个字符串传递给它,而Uri.TryCreate
不是尝试使用单个正则表达式复制 URL 解析的疯狂。
Url 的其余部分(在主机名之后)可能是垃圾。如果您想消除导致问题的那个位,则将所有内容提取到主机名的末尾:
^https?:\/\/[^\/]*
然后运行它Uri.TryCreate
。