次のスクリプトを考えてみましょう。
#! /bin/bash
line="confusing"
if [[ $line =~ [[:lower:]]* ]]
then
echo "matches!"
else
echo "does not match."
fi
上記のコードは期待した結果を生成しますが、次のコードはそうではありません。
#! /bin/bash
line="CoNfUsInG"
if [[ $line =~ [[:lower:]]* ]]
then
echo "matches!"
else
echo "does not match."
fi
これは「一致!」を印刷します
。正規表現は[[:lower:]]*
0個以上の小文字を意味しませんか?
以下に「matches!」も印刷すると、さらに混乱します。
#! /bin/bash
line="CoNfUsInG"
if [[ $line =~ [[:digit:]]* ]]
then
echo "matches!"
else
echo "does not match."
fi
なぜこれが起こるのかを説明できる人はいますか?
答え1
正規表現は文字列全体と一致する必要はありません。そのため、文字列の先頭と末尾にそれぞれとがあります^
。$
[[ CoNfUsInG =~ ^[[:lower:]]*$ ]] || echo no
CoNfUsInGlY、^[[:lower:]]*
(なし$
)は、文字列の先頭に小文字がないため、まだ一致します。