gpt4 book ai didi

regex - 完全合格的域名验证

转载 作者:行者123 更新时间:2023-11-29 08:44:49 26 4
gpt4 key购买 nike

是否有一种快速而粗略的方法来验证是否输入了正确的 FQDN?请记住,没有 DNS 服务器或互联网连接,因此必须通过 regex/awk/sed 进行验证。

有什么想法吗?

最佳答案

(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)

正则表达式总是充其量只是类似这样的事情的近似值,并且规则会随着时间而改变。上面的正则表达式是根据以下内容编写的,特定于主机名-

主机名由一系列用点连接的标签组成。每个标签的长度为 1 到 63 个字符,可能包含:

  • ASCII 字母 a-z(不区分大小写),
  • 数字 0-9,
  • 和连字符 ('-')。

另外:

一些假设:

  • TLD 至少有 2 个字符且只有 a-z
  • 我们希望至少比 TLD 高一级

结果:有效/无效

  • 911.gov - 有效
  • 911 - 无效(无 TLD)
  • a-.com - 无效
  • -a.com - 无效
  • a.com - 有效
  • a.66 - 无效
  • my_host.com - 无效(下划线)
  • typical-hostname33.whatever.co.uk - 有效

编辑:John Rix 提供了一个替代的正则表达式 hack,使 TLD 的规范成为可选的:

(?=^.{1,253}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(?<!-))|((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63})$)
  • 911 - 有效
  • 911.gov - 有效

编辑 2:有人要求提供一个适用于 js 的版本。它在 js 中不起作用的原因是因为 js 不支持正则表达式向后看。具体来说,代码 (?<!-) - 指定前一个字符不能是连字符。

无论如何,这里重写了没有后视——有点丑但不多

(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)

您同样可以对 John Rix 的版本进行类似的替换。

编辑 3:如果你想允许尾随点 - 这在技术上是允许的:

(?=^.{4,253}\.?$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}\.?$)

在@ChaimKut 指出并我做了一些研究之前,我不熟悉尾随点语法

然而,在我使用的各种工具中,使用尾随点似乎会导致一些不可预测的结果,因此我建议您谨慎一些。

关于regex - 完全合格的域名验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11809631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com