正则表达式用于在C#中获取域和子域

时间:2018-09-07 09:07:29

标签: c# regex

我需要根据当前网址正确获取域/子域。为了正确地从数据库中获取数据并进一步使用正确的参数调用Web api,这是必需的。

在垂直方面,我面临本地和生产网址的问题。对于前。

在本地,我有

http://sample.local.example.com 
http://test.dev.example.com

在生产中,我有

http://client.example.com 
http://program.live.example.com

我需要

Subdomain as: sample / test / client / program
Domain as: exmpale 

到目前为止,我尝试使用带有以下代码的c#来识别同一代码。它在我的本地计算机上运行良好,但我相信这会在某个时间点对生产造成影响。基本上,对于Subdomain,请获取第一部分,对于Domain,请在“ .com”之前获取最后一部分

 var host = Request.Url.Host;
 var domains = host.Split('.');
 var subDomain = domains[0];
 string mainDomain = string.Empty;
  #if DEBUG
    mainDomain = domains[2]; 
  #else
    mainDomain = domains[1]; 
  #endif

 return Tuple.Create(mainDomain, subDomain);

3 个答案:

答案 0 :(得分:4)

我认为Linq应该代替您的正则表达式。试试:

public static Tuple<string, string> GetDomains(Uri url)
{
    var domains = url.Host.Substring(0, url.Host.LastIndexOf(".")).Split('.');
    var subDomain = string.Join("/", domains.Take(domains.Length - 1));
    var mainDomain = domains.Last();
    return Tuple.Create(mainDomain, subDomain);
}

"http://program.live.example.com"的输出

example
program/live

Try it Online!

答案 1 :(得分:2)

此正则表达式应为您工作:

Match match = Regex.Match(temp, @"http://(\w+)\.?.*\.(\w+).com$");

string subdomain = match.Groups[1].Value;
string domain = match.Groups[2].Value;

http://(\w+)\.在点http://之后与1个或多个单词字符匹配为组1。

.*匹配零个或多个出现的任何字符

\.(\w+).com.com之前和点之后匹配1个或多个单词字符作为第2组

$指定字符串的结尾

\.?使点可选,以便在http://client.example.com中的第1组和第2组之间不存在任何情况时

答案 2 :(得分:1)

您做对了,您可以将域名作为数组中的倒数第二个值

var host = Request.Url.Host;
var domains = host.Split('.');
string subDomain = domains[0].Split('/')[2];
string mainDomain = domains[domains.Length-2];  
return Tuple.Create(mainDomain, subDomain);

,如果您需要所有子域,可以在此处放一个循环