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

本文关键字:主机 字符串 | 更新日期: 2023-09-27 18:36:41

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

示例字符串: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

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

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

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

    string FQDN_Pat = @"([a-zA-Z0-9]+)('.([a-zA-Z0-9])+)+";
    

这实际上与您的示例匹配,但我建议您阅读 C# 正则表达式手册以获取进一步参考,以防域名中有一些技巧

您之所以出现此行为,是因为您只匹配只包含模式的字符串。您正在使用^(字符串的开头)和$(字符串的结尾)。如果要匹配输入字符串中任意位置的模式,请从模式中删除这些字符。