在 bash 中使用正则表达式检查有效(子)域

在 bash 中使用正则表达式检查有效(子)域

如果我在正则表达式测试站点上进行测试,下面的正则表达式是正确的。但下面的代码不接受任何输入。我尝试的一切都是错误的。

   #!/bin/bash


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


    while [ "$domain" = "" ]
    do
            echo "Please provide domain:"
            read domain
    done

    until [[ $domain =~ $domainRegex ]]
    do
            echo "Enter valid domain:"
            read domain
    done

答案1

您正在使用 Perl 兼容正则表达式 (PCRE) 的功能。也就是说,(?=...)(?:...)不是 Bash 使用的标准扩展正则表达式的一部分。

但在我看来,你只是使用前者 (?=^.{4,253}$)来检查字符串的长度。如果这是正确的,则可以很容易地将其替换为针对字​​符串长度的直接测试:

if [ "${#domain}" -lt 4 ] || [ "${#domain}" -gt 253 ]; then
    echo "Domain name is too short or too long"
fi

那么,(?:...)很容易,它相当于(...),只不过它不捕获。额外的捕获对于整个正则表达式的匹配并不重要,因此我们可以?:从每个左括号中删除 。

另请注意(至少在 ERE 中)中的反斜杠[a-zA-Z0-9\-]匹配 a文字反斜杠。只需将破折号作为括号组中的第一个或最后一个字符即可匹配破折号(在 PCRE 和 ERE 中):[a-zA-Z0-9-]

通过这些修改,我们得到:

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

也可以看看:为什么我的正则表达式在 X 中有效但在 Y 中无效?

相关内容