评估bash正则表达式的有效FQDN

时间:2015-10-02 14:27:27

标签: regex string bash if-statement fqdn

正确的发布

@stribizhev是对的。你不能在bash正则表达式中使用预见。 我用grep。

#!/bin/bash

fqdn=$1
result=`echo $fqdn | grep -P '(?=^.{1,254}$)(^(?>(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$)'`
if [[ -z "$result" ]]
then
    echo "$fqdn is NOT a FQDN"
else
    echo "$fqdn is a FQDN"
fi
exit

感谢@stribizhev和<的帮助。 + OnlineCop>和< tureba>在http://webchat.freenode.net/?nick=regex101

原始帖子

我正在尝试使这个正则表达式工作来评估字符串是否是有效的FQDN但没有成功。我经历了各种搜索,也没有成功。

例如,我复制了一个正则表达式 http://regexlib.com/REDetails.aspx?regexp_id=1319 并试过这种方式,但没有工作。什么可能是错的?

#!/bin/bash

fqdn=$1
if [[ "$fqdn" =~ (?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$) ]]
then
        echo "$fqdn is a FQDN"
else
        echo "$fqdn is NOT a FQDN"
fi
exit

1 个答案:

答案 0 :(得分:1)

只需对原作进行一点修改,即可使用grep -P代替bash来完成此操作:

grep -P '(?=^.{1,254}$)(^(?>(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$)'

您可以看到匹配here

如果您感兴趣,区别在于将(^(?:(?!更改为(^(?>(?!以防止灾难性的回溯。

zsh支持在-pcre-match[...]内使用的[[...]]标记,如StackExchange所述,如果您希望使用这可能是一种方法另一个shell而不是bash,尽管bash脚本并不总是与zsh脚本兼容。