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

PCRE(Perl Compatible Regular Expressions)機能を使用しています。つまり、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\-]スラッシュ言葉バックスラッシュ。ダッシュは、角かっこグループの最初または最後の文字に単純に一致します(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では動作しないのはなぜですか?

おすすめ記事