【问题标题】:Parse multiple hostnames from string从字符串中解析多个主机名
【发布时间】:2015-01-08 13:51:34
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • first - 从开头删除 ^ 并从末尾删除 $ - 它们意味着匹配应该从第一个字符开始并在最后一个字符结束,这需要字符串完全匹配
  • 仅供参考:您可以将 ([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\-]{0,61}[a-zA-Z0-9])?)
  • FQDN 以点结尾 (.)。它们都不是 FQDN,因为它们不以点结尾。我更正了标题和问题陈述。

标签: c# regex parsing


【解决方案1】:

由于正则表达式相当复杂,我尝试对其进行简化。所以我所做的是

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

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

这实际上与您的示例匹配,但我建议您阅读 C# regexp 手册以获取更多参考,以防域名中存在一些技巧

【讨论】:

    【解决方案2】:

    你得到这个行为是因为你只匹配除了你的模式之外什么都不包含的字符串。您正在使用^(字符串的开头)和$(字符串的结尾)。如果您想在输入字符串中的任何位置匹配您的模式,请从模式中删除这些字符。

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      相关资源
      最近更新 更多