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-matchbash以外のシェルを使用する場合にこれを実現する方法になる可能性がありますが、bash スクリプトは常に zsh スクリプトと互換性があるわけではありません。[...][[...]]

于 2015-10-02T15:34:00.953 に答える