https://regex101.com/ を使用する正規表現を作成して、文字列内の最初のIPアドレスを返します。
正規表現:
(?:\d{1,3}\.)+(?:\d{1,3})
区切り文字を含むRegExp:
/(?:\d{1,3}\.)+(?:\d{1,3})/
次のテスト文字列で:
eu-west 140.243.64.99
次の完全一致を返します。
140.243.64.99
アンカーなどで何を試しても、次のbashスクリプトは生成された正規表現では機能しません。
temp="eu-west 140.243.64.99 "
regexp="(?:\d{1,3}\.)+(?:\d{1,3})"
if [[ $temp =~ $regexp ]]; then
echo "found a match"
else
echo "No IP address returned"
fi
\d
は、「任意の数字」を言うための非標準的な方法です。私はそれがPerlから来ていると思います、そして他の多くの言語とユーティリティもPerl互換RE(PCRE)をサポートします。 (そして、例えば、GNU grep 2.27は、通常モードでも、Word文字に対して同様の\w
をサポートしています。)
ただし、Bashは\d
をサポートしていないため、[0-9]
または[[:digit:]]
を明示的に使用する必要があります。非キャプチャグループ(?:..)
についても同様ですが、代わりに(..)
のみを使用してください。
これはmatch
を出力するはずです:
temp="eu-west 140.243.64.99 "
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
[[ $temp =~ $regexp ]] && echo match
サイト regex101.com デフォルトとしてPCRE(左上隅をご覧ください)を使用しており、「拡張」正規表現構文のサポートが不足しています。それが「Perl互換の正規表現」であり、Perlから(当然のことながら)Perlに由来しています。
PCREは、いくつかのツール(grep -P
など)でサポートされていますが、[[…]]
イディオム内のbash正規表現のサポートは、拡張正規表現(grep -E
など)に対してのみサポートされています。
拡張正規表現では、キャプチャ以外の(?…)
括弧は存在せず、\ dもありません。シンプルな(…)
と[0-9]
を使用する必要があります:
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"