从字符串中解析多个主机名

时间:2015-01-08 13:51:34

标签: c# regex parsing

我正在尝试使用C#中的Regex从字符串中解析多个主机名。

示例字符串:abc.google.com another example here abc.microsoft.com and another example abc.bbc.co.uk

我一直在尝试的代码如下:

string input = "abc.google.com another example here abc.microsoft.com and another example abc.bbc.co.uk";
string FQDN_Pat = @"^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$";

Regex r = new Regex(FQDN_Pat);
Match m = r.Match(input);         
while (m.Success)
{
    txtBoxOut.Text += "Match: " + m.Value + " ";
    m = m.NextMatch();
}

如果字符串完全符合模式,则代码有效,例如abc.google.com

如何更改正则表达式以匹配示例字符串中的模式,例如所以输出将是:

匹配:abc.google.com
   匹配:abc.microsoft.com
   匹配:abc.bbc.co.uk

如果这很简单,事先道歉,因为我对正则表达式的了解并不是很好! :)谢谢!

更新

将正则表达式更新为以下内容(删除^$):

string FQDN_Pat = @"([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA‌​-Z0-9\-]{0,61}[a-zA-Z0-9]))"; 

结果如下:

第1场比赛:abc.g
   第2场比赛:oogle.c
   第3场比赛:abc.m
   第4场比赛:icrosoft.c
   第5场比赛:abc.b
   第6场比赛:bc.c
   第7场比赛:o.u

2 个答案:

答案 0 :(得分:2)

由于正则表达式相当复杂,我试图简化它。所以我所做的就是

  1. 删除^$以使正则表达式匹配
  2. 简化您匹配的字符,因此我使用([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])而不是([a-zA-Z0-9])+代替+,这意味着查找长度大于1的任何字母数字序列(X符号表示你匹配一次或多次出现的字符)。我们称之为X(\.X)+。如果FQDN中的名称规则更复杂,请修改此值
  3. 查找FQDN的表达式为.。这可以被视为字符序列,后跟一个或多个序列,所有这些都由点(X)分隔。 替换string FQDN_Pat = @"([a-zA-Z0-9]+)(\.([a-zA-Z0-9])+)+"; 你有完整的表达式

    {{1}}
  4. 实际上与您的示例匹配,但我建议您阅读C#regexp手册以获取进一步的参考,以防域名中有一些技巧

答案 1 :(得分:1)

您会收到此行为,因为您只匹配除了您的模式之外不包含任何其他内容的字符串。您正在使用^(字符串的开头)和$(字符串的结尾)。如果要在输入字符串中的任何位置匹配您的模式,请从模式中删除这些字符。