从字符串中解析多个主机名
Parse multiple hostnames from string
我正在尝试使用 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
您之所以会出现这种情况,是因为您只匹配了只包含您的模式的字符串。您正在使用 ^
(字符串的开头)和 $
(字符串的结尾)。如果您想匹配输入字符串中任何位置的模式,请从模式中删除这些字符。
由于正则表达式非常复杂,我尝试对其进行了一些简化。所以我所做的是
- 删除
^
和 $
以使正则表达式匹配任何地方
- 简化您匹配的字符,所以我使用
([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 中的名称规则更复杂,请修改此值
查找 FQDN 的表达式是 X(\.X)+
。这可以看作是字符序列后跟 一个或多个 序列,所有字符都由点 (.
) 分隔。
替换 X
你有完整的表达式
string FQDN_Pat = @"([a-zA-Z0-9]+)(\.([a-zA-Z0-9])+)+";
这实际上与您的示例匹配,但我建议您阅读 C# regexp 手册以进一步参考,以防域名中存在一些技巧
我正在尝试使用 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
您之所以会出现这种情况,是因为您只匹配了只包含您的模式的字符串。您正在使用 ^
(字符串的开头)和 $
(字符串的结尾)。如果您想匹配输入字符串中任何位置的模式,请从模式中删除这些字符。
由于正则表达式非常复杂,我尝试对其进行了一些简化。所以我所做的是
- 删除
^
和$
以使正则表达式匹配任何地方 - 简化您匹配的字符,所以我使用
([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 中的名称规则更复杂,请修改此值 查找 FQDN 的表达式是
X(\.X)+
。这可以看作是字符序列后跟 一个或多个 序列,所有字符都由点 (.
) 分隔。 替换X
你有完整的表达式string FQDN_Pat = @"([a-zA-Z0-9]+)(\.([a-zA-Z0-9])+)+";
这实际上与您的示例匹配,但我建议您阅读 C# regexp 手册以进一步参考,以防域名中存在一些技巧