我想创建一个脚本,将新的域添加到我们的DNS服务器。
我发现Fully qualified domain name validation正则表达式。
但是,当我将它与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

我希望第一个命令的输出应该是一个空行。
我做错什么了?

最佳答案

我发现这是一个更全面的正则表达式:
(?=^.{4,253}$)(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$)
允许长度为0,这是我所知道的最短的操作域,仍然是匹配其他答案的地方。255字节是最大长度,减去每个标签长度的八位位组(TLD和“主”子域)给我们253:(?=^.{4,253}$)
RFC 1034§3: :技术上允许使用单字母tld,这意味着最小长度为3,但由于目前没有单字母tld,因此最小长度为4是可行的。
RFC 3696§2:允许子域中有数字,而Conor Clafferty显然没有(通过不区分其他子域和“主”子域,即您注册的域,而DNS规范没有)
RFC 1034§3:将单个标签限制为63个字符,允许中间使用连字符,同时将开头和结尾限制为字母数字(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){,61}[a-zA-Z0-9])?\.)
需要两个字母或更大的TLD[a-zA-Z]{2,}
RFC 1034§3:DNS规范在技术上允许TLD中的数字和单字母TLD;但是,目前没有单字母TLD或带数字的TLD,并且不允许所有数字TLD,因此regex的这一部分被简化了。

关于regex - 基于Bash的正则表达式域名验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15268987/

10-14 16:41