用于从C#中的URL解析主机名的正则表达式?
嘿,我很好奇如何用C#中的正则表达式解析URL中的主机名 我有以下正则表达式:用于从C#中的URL解析主机名的正则表达式?,c#,regex,C#,Regex,嘿,我很好奇如何用C#中的正则表达式解析URL中的主机名 我有以下正则表达式: Regex regexUrl = new Regex("://(?<host>([a-z\\d][-a-z\\d]*[a-z\\d]\\.)*[a-z][-a-z\\d]+[a-z])"); Regex regexUrl=new Regex(“:/(?([a-z\\d][a-z\\d]*[a-z\\d]\\)*[a-z][a-z\\d]+[a-z]); 但是,当URL不包含“http://”时,它会抛
Regex regexUrl = new Regex("://(?<host>([a-z\\d][-a-z\\d]*[a-z\\d]\\.)*[a-z][-a-z\\d]+[a-z])");
Regex regexUrl=new Regex(“:/(?([a-z\\d][a-z\\d]*[a-z\\d]\\)*[a-z][a-z\\d]+[a-z]);
但是,当URL不包含“http://”时,它会抛出一个错误,并且它也不会解析出URL的“www.”部分
那么,我该如何编写一个函数,从URL解析出“hostname.com”,即使它不包含“http://”。谢谢:)为什么不做这样的事呢
Uri uri;
if (!Uri.TryCreate(s, UriKind.Absolute, out uri)) {
if (!Uri.TryCreate("http://" + s, UriKind.Absolute, out uri)) {
throw new ArgumentException();
}
}
return uri.Host;
它的行数更多,但可能比正则表达式更干净,更容易阅读。为什么不做类似的事情呢
Uri uri;
if (!Uri.TryCreate(s, UriKind.Absolute, out uri)) {
if (!Uri.TryCreate("http://" + s, UriKind.Absolute, out uri)) {
throw new ArgumentException();
}
}
return uri.Host;
它有更多的行,但可能比正则表达式更简洁,更易于阅读。我不会使用正则表达式
我不会使用正则表达式
[^\/\.\s]+\.[^\/\.\s]+\/
-唯一的问题是它需要在主机名之后/
,[^\/\.\s]+\.[^\/\.\s]+\/
-唯一的问题是,如果您坚持使用正则表达式,它需要在主机名之后/,这应该可以做到:^([a-z]+//)(?[a-z\d][a-z-]a-z]/.-/-]d.[*]
诀窍是让最后一个字符匹配a/
或终止符($
)如果你坚持使用正则表达式,那么应该这样做:^([a-z]+:/)?(?[a-z\d][a-z\d-]*(\.[a-z\d][a-z\d-]*))*)[/$]
诀窍是让最后一个字符匹配/
或终止符($
)这在提供“testServer:666”时不起作用。URI的主机将是未知的。您应该按照以下方式更正示例:{if(!Uri.TryCreate(uriStr,UriKind.Absolute,out Uri)| Uri.HostNameType==UriHostNameType.Unknown){if(!Uri.TryCreate(“http:/”+uriStr,UriKind.Absolute,out Uri)| Uri.HostNameType==UriHostNameType.Unknown){抛出新的ArgumentException()}当提供“testServer:666”时,这不起作用。URI的主机将是未知的。您应该按照以下方式更正示例:{if(!Uri.TryCreate(uriStr,UriKind.Absolute,out Uri)| Uri.HostNameType==UriHostNameType.Unknown){if(!Uri.TryCreate(“http:/”+uriStr,UriKind.Absolute,out Uri)| Uri.HostNameType==UriHostNameType.Unknown){抛出新的ArgumentException()}