You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则分别验证经典域名、ACE IDN及非ACE IDN?

域名离线格式验证正则方案

一、经典域名(Classic DNs)

推导规范

  • 遵循RFC 1034/1035核心规则:整体长度(含点)≤253个ASCII字符;每个标签(点分隔部分)长度1-63个ASCII字符;标签仅允许小写字母a-z、数字0-9、连字符-;标签不能以连字符开头/结尾;TLD标签不能以数字开头(修正公开正则的TLD数字开头问题)

正则表达式

^(?!.{254,})([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?$

说明

  • 前置断言(?!.{254,})快速拦截超长输入,避免不必要的正则匹配,提升性能
  • 标签结构[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?确保首尾非连字符,长度符合1-63的要求
  • 最后一个标签(TLD)以[a-z]开头,直接规避数字开头的无效TLD格式
  • 宽松验证逻辑:不限制TLD具体列表,仅做通用格式校验;若需支持大写输入,可添加i标志或先将输入转为小写

二、ACE IDN(Punycode编码IDN)

推导规范

  • 基于IDNA 2008的ACE编码规则:每个标签必须以xn--开头;标签剩余部分仅允许a-z、0-9、-,且不能以连字符结尾;整体长度(含点)≤253个ASCII字符;每个标签(含xn--)长度1-63个ASCII字符;TLD的ACE标签不能以数字开头(即xn--后的首个字符不能是数字)

正则表达式

^(?!.{254,})(xn--[a-z0-9](?:[a-z0-9-]{0,57}[a-z0-9])?\.)+xn--[a-z](?:[a-z0-9-]{0,57}[a-z0-9])?$

说明

  • xn--占用4个字符,因此标签剩余部分长度限制为1-59,正则通过[a-z0-9](?:[a-z0-9-]{0,57}[a-z0-9])?实现该长度控制
  • 前置断言快速过滤超长输入,优化性能
  • TLD部分通过xn--[a-z]确保编码后的TLD不以数字开头
  • 仅做格式校验,不验证Punycode的编码有效性(离线场景无需解码);输入若含大写,需先转为小写再验证

三、非ACE IDN(原生Unicode IDN)

推导规范

  • 基于IDNA 2008的PVALID字符集修正(修正旧文档的错误与过时规则):允许Unicode通用字母(\p{Letter},含各语言大小写字母、字母标记)、Unicode十进制数字(\p{Number})、连字符-;整体长度(Unicode码点)≤253;每个标签长度1-63个Unicode码点;标签不能以连字符开头/结尾;TLD标签不能以数字开头;禁用Unicode控制字符、私有区域字符、非PVALID符号(如空格、下划线等)

正则表达式(需支持ES2018+ Unicode属性转义,即启用v标志)

^(?!\p{Any}{254,})([\p{Letter}\p{Number}](?:[\p{Letter}\p{Number}-]{0,61}[\p{Letter}\p{Number}])?\.)+[\p{Letter}](?:[\p{Letter}\p{Number}-]{0,61}[\p{Letter}\p{Number}])?$

说明

  • 用\p{Letter}和\p{Number}覆盖所有符合IDNA标准的Unicode字符,替代旧文档中有限的字符列表,适配多语言域名
  • 前置断言(?!\p{Any}{254,})快速拦截超长码点序列,提升验证效率
  • 标签结构确保首尾非连字符,避免无效格式
  • TLD以\p{Letter}开头,禁止数字开头的无效TLD
  • 宽松验证逻辑:不限制特定语言字符,仅校验字符类别与通用格式

内容的提问来源于stack exchange,提问作者Thejaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:12:39