在C#中验证FQDN

6
有人有验证合法FQDN的正则表达式吗?
现在,我使用这个正则表达式:
(?=^.{1,254}$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]{1,63}(?!-)\.?)+(?:[a-zA-Z]{2,})$)

然而,这个正则表达式导致"aa.a"无效,而"aa.aa"是有效的。有人知道为什么吗?
2个回答

4

以下是一个更短的模式:

(?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$)

关于为什么模式将"aa.a"确定为无效,而将"aa.aa"确定为有效,这是因为{2,} - 如果您将2更改为1,以便它为

(?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{1,})$)

应该将"aa.a"和"aa.aa"都视为有效。

string pattern = @"(?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{1,})$)";
bool isMatch = Regex.IsMatch("aa.a", pattern);

isMatch 对我来说是 TRUE。


我这样做了,但它不起作用,它仍将“aa.a”确定为无效,而“aa.aa”为有效。你能解释一下"{1,}"代替"{2,}"的含义吗? - RRR
使用模式{1.} "aa.a" 对我进行了验证。花括号指定了特定的重复次数,因此{1,}至少需要1次重复,{2,}至少需要2次。 - bitxwise
另外一个问题是,您建议的模式与我使用的模式有什么不同? - RRR
唯一的区别是你的最后一个点有 (?!-).?),而我发布的有 \.?)。你的 ?! 使用了 _负向先行断言_("匹配不跟随某些内容的内容")。 - bitxwise
现在我想允许 "aa.a10",所以我将正则表达式更改为:(@"(?=^.{1,254}$)(^(?:(?!\d+.)[a-zA-Z0-9_-]{1,63}.?)+(?:[a-zA-Z0-9]{1,})$)") 但它不起作用,你知道为什么吗? - RRR
@RRR:这对我有效...尝试用你的"aa.a10"条目来隔离模式。 - bitxwise

4
我认为这也是一个选择,特别是如果 FQDN 以后将与 System.Uri 一起使用:
var isWellFormed = Uri.CheckHostName(stringToCheck).Equals(UriHostNameType.Dns);

请注意,此代码认为部分合格的域名是格式正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接