假设你的正则表达式:
/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
实际上并解析URL(我没有检查它),你可以很容易地使用捕获组获取主机:
/^(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
。
我欣赏你的努力,但你为什么不使用已经在.NET中提供的解决方案?http://msdn.microsoft.com/en-us/library/system.uri.aspx – matcheek
您是否想向我们展示至少一个源文本样本,然后展示您期望的内容以及您获得的内容?它使得它更容易理解... – Chris
这种模式不会返回任何结果,您能否告诉我们一个真正的尝试 –