【发布时间】:2024-09-02 02:35:02
【问题描述】:
有没有人有正则表达式来验证合法的 FQDN?
现在,我在这个正则表达式上使用:
(?=^.{1,254}$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]{1,63}(?!-)\.?)+(?:[a-zA-Z]{2,})$)
但是,此正则表达式导致“aa.a”无效,而“aa.aa”有效。
有人知道为什么吗?
【问题讨论】:
有没有人有正则表达式来验证合法的 FQDN?
现在,我在这个正则表达式上使用:
(?=^.{1,254}$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]{1,63}(?!-)\.?)+(?:[a-zA-Z]{2,})$)
但是,此正则表达式导致“aa.a”无效,而“aa.aa”有效。
有人知道为什么吗?
【问题讨论】:
我认为这也是一种选择,特别是如果 FQDN 稍后将与 System.Uri 一起使用:
var isWellFormed = Uri.CheckHostName(stringToCheck).Equals(UriHostNameType.Dns);
请注意,此代码认为部分限定的域名格式正确。
【讨论】:
这是一个较短的模式:
(?=^.{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 对我来说是正确的。
【讨论】:
{1.} "aa.a" 一起使用对我来说是有效的。花括号指定了特定的重复次数,因此{1,} 需要至少 1 次重复,{2,} 需要至少 2 次。
(?!-).?),而我发布的那个是\.?)。你的?! 使用了一个否定的前瞻断言(“匹配一些东西而不是其他东西”)。