名前がhdpworker01
の場合、次の正規表現がvalid
を出力するのはなぜですか?
name=hdpworker01
[[ $name =~ worker[[:digit:]] ]] && echo valid
私がやろうとしているのは、名前がworker[0-999]
と一致する場合にのみvalid
を出力することです。
期待される結果の例:
name=worker01
の場合:valid
name=hdpworker01
の場合:出力なし正規表現は、デフォルトでは文字列の最初または最後に固定されていません。これは、例えばとは異なります。ファイル名のグロブパターン。これは、式が指定された文字列のどこにでも一致する可能性があることを意味します。
式を文字列の先頭に固定するには、次を使用します。
^worker[[:digit:]]
さらに文字列の末尾に固定し、1〜3桁の数字を使用できるようにするには、次を使用します。
^worker[[:digit:]]{1,3}$
一致させたい場合はworker10
だがしかし worker01
またはworker003
(ゼロで埋められた数字はありません)、使用
^worker([0-9]|[1-9][0-9]{1,2})$
両側に正規表現を固定します。
^worker[[:digit:]]$
名前がhdpworker01であるのに、次の正規表現が有効である理由
どうして?正規表現はアンカーではないため、つまり、一致するはずの文字列の開始(または終了)を定義しません。一致する文字列のいずれかの部分がworker
の場合、正規表現worker
が一致します。 hdpworkeranything
およびworker
と他の多くのバリエーションに一致します。 worker
で始まる文字列を照合するには、次のように正規表現に^
を含めます。
^worker
Wordワーカーの後の3桁(最大)を一致させたい場合は、次を使用できます。
^worker[0-9]{0,3}$
ただし、括弧で数字を取得し、変数内に正規表現を配置することをお勧めします(変数を使用することが現在のベストプラクティスです)。
re='^worker([0-9]{0,3})$'
$
は、文字列がその時点で終了する必要があることを意味します。
試合は次のようになります:
[[ $str =~ $re ]] && n=$((10#${BASH_REMATCH[1]}+0)) || n=-1
私がやろうとしているのは、名前がworker [0-999]の場合にのみ有効な印刷を行うことです。
そして、それは数n
範囲をチェックすることを可能にします:
(( 0 <= n && n <= 999 )) && echo "valid with n=$n"