1. ホーム
  2. regex

[解決済み】Bashスクリプトで文字列が正規表現にマッチするかどうかを確認する

2022-04-01 17:11:49

質問

私のスクリプトが受け取る引数の1つは、次の形式の日付です。 yyyymmdd .

入力として有効な日付が得られるかどうかをチェックしたい。

どうすればいいのでしょうか?私は次のような正規表現を使おうとしています。 [0-9]\{\8}

どのように解決するのですか?

テストコンストラクトを使用することができます。 [[ ]] 正規表現のマッチ演算子と一緒に使用します。 =~ を使用すると、文字列が正規表現に一致するかどうかを確認することができます。

具体的なケースでは、こう書けばいい。

[[ "$date" =~ ^[0-9]{8}$ ]] && echo "yes"

というより正確なテスト。

[[ "$date" =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
#             |\______/\______*______/\______*__________*______/|
#             |   |           |                  |              |
#             |   |           |                  |              |
#             | --year--   --month--           --day--          |
#             |          either 01...09      either 01..09      |
#      start of line         or 10,11,12         or 10..29      |
#                                                or 30, 31      |
#                                                          end of line

つまり、正規表現を バッシュ は、希望する書式にマッチします。こうすると、できるようになります。

[[ "$date" =~ ^regex$ ]] && echo "matched" || echo "did not match"

の後のコマンドは && の後のコマンドはテストが成功した場合に実行されます。 || は、テストが失敗した場合に実行されます。

これは、Aleks-Daniel Jakimenkoによる解決策に基づいていることに注意してください。 bashでのユーザー入力の日付形式検証 .


他のシェルでは グレップ . お使いのシェルが POSIX 準拠の場合は、次のようにします。

(echo "$date" | grep -Eq  ^regex$) && echo "matched" || echo "did not match"

というのは、POSIXに準拠していないため、次のようになります。

echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"

注意事項 これらのポータブルな grep ソリューションは 防水ではありません 例えば、入力パラメータに改行が含まれていると騙されることがあります。最初に紹介した bash-specific regex check にはこのような問題はありません。