2

更正后的帖子

@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
4

1 回答 1

1

对原始版本稍作修改,您可以使用grep -P而不是 bash 来完成此操作:

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

你可以在这里看到比赛。

如果您有兴趣,不同之处在于更改(^(?:(?!(^(?>(?!以防止灾难性的回溯。

zsh 支持在StackExchange-pcre-match中使用[...][[...]]描述的标志,如果您希望使用 bash 以外的其他 shell,这可能是实现此目的的一种方式,尽管 bash 脚本并不总是与 zsh 脚本兼容。

于 2015-10-02T15:34:00.953 回答