【问题标题】:Regex validation for ordering domains排序域的正则表达式验证
【发布时间】:2023-07-13 17:00:01
【问题描述】:

我的朋友们, 我想就我的正则表达式要求向您寻求帮助。我需要根据 JS 中客户端的约定对域进行正则表达式验证:

  • 63 个字符。这 63 个字符不包括所谓的协议标识符 https:// 或域扩展名(例如子域上的 .com 或 .org)
  • 字符串的开头和结尾没有连字符,但可以在 text-example.com 等域中使用
  • 不允许使用特殊字符
  • 注册域名时可以使用句点,但子域可以使用句点
  • 域可以有数字
  • 客户端可以提供多个用分号分隔的域 - 每个域都应单独验证

一开始,我认为每个点都有一个单独的正则表达式是可以的,但我认为这会很耗时。有人能帮我解决一下话题吗?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    我对“https://*.com/questions/6449367/c-sharp-email-address-validation/6459786”问题的回答可能会对您有所帮助:https://*.com/a/6459786/467473

    它在 C# 中实现了一个电子邮件地址验证器。您不关心“本地部分”(电子邮件地址中@ 左侧的位,或@ 本身。您感兴趣的是fqdn 生产,这应该相当简单映射到 Javascript 正则表达式。

    进一步考虑,听起来您所描述的确实是一个 DNS 标签,一个 DNS 名称的单个段。

    如果您想要验证符合 RFC 的 DNS 标签,那么这个规则表达式应该可以满足您的需求:

    const rxDnsLabel = /^[A-Z]([A-Z0-9-]{0,61}[A-Z0-9])?$/i;
    

    分解:

    • ^ — 将匹配的开头锚定到文本开头,然后是
    • [A-Z] — 一个 US-ASCII 字母,后跟
    • ( — 可选组,包括
      • [A-Z0-9-] — 美国 ASCII 字母、十进制数字或连字符 (-)
        • {0,61} — 重复 0 到 61 次,然后是
      • [A-Z0-9] 单个 US-ASCII 字母或十进制数字
    • )? — 全部可选
    • $ — 将匹配的结尾锚定到文本结尾

    如果您需要匹配一个由多个标签组成的 DNS 名称,这并不复杂。只需要允许可选的额外段:

    const rxDnsLabel = /^([A-Z]([A-Z0-9-]{0,61}[A-Z0-9])?)([.][A-Z]([A-Z0-9-]{0,61}[A-Z0-9])?)*$/i;
    

    这里唯一的区别是初始标签后面可以跟零个或多个附加标签,每个标签用句点/句号分隔 (.)。

    编辑说明:如果您需要对国际化(punycode)域名的支持,我不能保证这将匹配它们 主要是因为我从来不需要这样做,所以没有针对他们进行测试。有关国际化(punycode)域名的详细信息,请参阅相关 RF:

    【讨论】: