我正在尝试将所有网址都放在一个正则表达式中,目前我正在使用此模式。
/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
然而,正则表达式返回页面/文件,而不是主机。因此,我不希望运行第二个正则表达式,而是希望有人可以提供帮助
这会返回http://www.yoursite.com/index.html
我正在尝试返回yoursite.com
。
此外,正则表达式将从html进行解析,之后将检查主机,因此100%的准确性并不重要。
答案 0 :(得分:2)
假设你的正则表达式:
/^(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
运行。
答案 1 :(得分:0)
要从示例文本yoursite.com
中仅捕获http://www.yoursite.com/index?querystring=value
,您可以使用此表达式,但这不会验证字符串:
^(https?:\/\/)?(?:[^.\/?]*[.])?([^.\/?]*[.][^.\/?]*)