我正在尝试使用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
答案 0 :(得分: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中的名称规则更复杂,请修改此值查找FQDN的表达式为.
。这可以被视为字符序列,后跟一个或多个序列,所有这些都由点(X
)分隔。
替换string FQDN_Pat = @"([a-zA-Z0-9]+)(\.([a-zA-Z0-9])+)+";
你有完整的表达式
{{1}}
实际上与您的示例匹配,但我建议您阅读C#regexp手册以获取进一步的参考,以防域名中有一些技巧
答案 1 :(得分:1)
您会收到此行为,因为您只匹配除了您的模式之外不包含任何其他内容的字符串。您正在使用^
(字符串的开头)和$
(字符串的结尾)。如果要在输入字符串中的任何位置匹配您的模式,请从模式中删除这些字符。