【问题标题】:Evaluation of a valid FQDN on bash regex [duplicate]在 bash 正则表达式上评估有效的 FQDN [重复]
【发布时间】:2015-10-02 14:27:26
【问题描述】:

更正的帖子

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

【问题讨论】:

  • 此处描述了一个 FQDN en.wikipedia.org/wiki/Fully_qualified_domain_name。 “www.aa.com”将是一个匹配的示例。 “xxx”将不匹配。 “@#$#.com”将不匹配。
  • @stribizhev,我尝试了您的示例,但没有成功。如果行是什么? if [[ "$fqdn" =~ ^(?=.{1,254}$)(?:(?![0-9]+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$ ]]
  • 我认为你不能在 bash 正则表达式中使用前瞻。您将需要另一种模式。或者使用 Perl。

标签: regex string bash if-statement fqdn


【解决方案1】:

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

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

你可以看到匹配here。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多