【问题标题】:Validate FQDN in C#在 C# 中验证 FQDN
【发布时间】:2024-09-02 02:35:02
【问题描述】:

有没有人有正则表达式来验证合法的 FQDN?

现在,我在这个正则表达式上使用:

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

但是,此正则表达式导致“aa.a”无效,而“aa.aa”有效。

有人知道为什么吗?

【问题讨论】:

    标签: c# regex fqdn


    【解决方案1】:

    我认为这也是一种选择,特别是如果 FQDN 稍后将与 System.Uri 一起使用:

    var isWellFormed = Uri.CheckHostName(stringToCheck).Equals(UriHostNameType.Dns);
    

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

    【讨论】:

      【解决方案2】:

      这是一个较短的模式:

      (?=^.{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 对我来说是正确的。

      【讨论】:

      • 我这样做了,但它不起作用,它再次确定“aa.a”为无效,“aa.aa”为有效。你能解释一下“{1,}”而不是“{2,}”是什么意思吗?
      • 将模式与{1.} "aa.a" 一起使用对我来说是有效的。花括号指定了特定的重复次数,因此{1,} 需要至少 1 次重复,{2,} 需要至少 2 次。
      • 附加问题,您建议我的模式与我使用的模式有什么不同?
      • 唯一的区别是你的最后一个点是(?!-).?),而我发布的那个是\.?)。你的?! 使用了一个否定的前瞻断言(“匹配一些东西而不是其他东西”)。
      • 现在我还想允许“aa.a10”,我将正则表达式更改为:(@"(?=^.{1,254}$)(^(?:(?!\d+\ .)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z0-9]{1,})$)") 但它不起作用,做你知道为什么吗?