基于Bash的正则表达式域名验证

Pet*_*ter 2 regex dns bash

我想创建一个脚本,将新域添加到我们的DNS服务器.我发现完全合格的域名验证 REGEX.但是,当我将它与sed一起使用时,它无法正常工作:

echo test | sed  '/(?=^.{5,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(:[a-zA-Z]{2,})$)/p'  
--------
Output is: 
test
echo test.com | sed  '/(?=^.{5,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(:[a-zA-Z]{2,})$)/p'  
--------
Output is: 
test.com
Run Code Online (Sandbox Code Playgroud)

我预计第一个命令的输出应该是一个空行.我做错了什么?

Dok*_*r J 10

我发现这是一个更全面的正则表达式:

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

  • RFC1034§3:允许长度为4-25 3,具有我所知道的最短操作域"t.co",仍然与其他答案不匹配.255个字节是最大长度,减去每个标签的长度八位字节(TLD和"主要"子域)给我们253:(?=^.{4,253}$)
    • RFC3696§2:单字母TLD 技术上是允许的,意味着最小长度为3,但由于目前没有单字母TLD,因此最小长度为4是实用的.
  • RFC1034§3:允许子域中的数字,Conor Clafferty显然没有(通过不区分其他子域与"主要"子域 - 即您注册的域 - DNS规范没有)
  • RFC1034§3:将单个标签限制为63个字符,允许中间使用连字符,同时限制字母数字的开头和结尾(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){,61}[a-zA-Z0-9])?\.)
  • 需要两个字母或更大的TLD [a-zA-Z]{2,}
    • RFC3696§2:DNS规范在技术上允许TLD中的数字以及单字母TLD; 但是,目前目前没有单字母TLD或TLD,并且不允许使用全数字TLD,因此这部分正则表达式已经简化.

  • 感谢您的精确,解释自己,并引用消息来源.有助于做出快速,明智的选择. (2认同)