正規表現テストサイトでテストすると、以下の正規表現は正しいです。ただし、以下のコードはいかなる入力も受け付けません。私が試したすべてが間違っています。
#!/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,}$