Bash での正規表現のマッチング
- Bash のリマッチ演算子
- Bash での数字のマッチ
- Bash で文字列の先頭に Regex マッチする
- Bash で文字列の末尾を正規表現でマッチさせる
- Bash での電子メールのリージェックスマッチ
このチュートリアルでは、bash で re-match 演算子を使用した正規表現の一致について説明します。
Bash のリマッチ演算子
=〜
演算子は、マッチング演算子として知られています。次の構文を使用します。
[[ string =~ regex ]]
マッチング演算子は、左から右への文字列の正規表現照合を実行します。左側が右側と一致する場合、演算子は 0
を返し、それ以外の場合は 1
を返します。
Bash での数字のマッチ
以下のスクリプトは、変数 $greet
の右側に記載されている文字(この場合は数字)が含まれているかどうかを確認します。完全一致がある場合、マッチング演算子は 0
を返し、スクリプトは正しい出力を出力します。
greet="Hello,World!"
if [[ $greet =~ [0-9] ]]; then
printf "$greet is a number\n"
else
printf "$greet is not a number\n"
fi
$greet
変数の値には数字以外の文字しか含まれていないため、マッチング演算子は 1
を返し、以下の出力を出力します。
Hello,World! is not a number
ここでは、num
とだけ呼ばれる番号を持つ新しい変数をスクリプトに作成します。次に、num
変数に数値のみがあるかどうかを確認し、再一致演算子によって返された値に応じてそれぞれの出力を出力します。
#!/bin/env bash
num="2021"
if [[ $num =~ [0-9] ]]; then
printf "$num is a number\n"
else
printf "$num is not a number\n"
fi
変数 num
には数字のみがあるため、マッチング演算子は 0
を返し、スクリプトは以下のステートメントを出力します。
2021 is a number
Bash で文字列の先頭に Regex マッチする
以下のスクリプトは、$greet
変数の値が数字で始まっているかどうかを確認します。^
は、文字列の先頭の文字と一致するように指定するために使用されます。演算子から返された値に応じて、それぞれの出力を出力します。
#!/bin/env bash
greet="123Hello,World!"
if [[ $greet =~ ^[0-9] ]]; then
printf "$greet starts with a digit(s).\n"
else
printf "$greet does not start with a digit(s)\n"
fi
$greet
変数の値は数値で始まるため、演算子は 0
を返し、以下の出力を出力します。
123Hello,World! starts with a digit(s).
以下に示すように、$greet
を新しい値に設定してスクリプトを実行しましょう。
#!/bin/env bash
greet="Hello,World!123"
if [[ $greet =~ ^[0-9] ]]; then
printf "$greet starts with a digit(s).\n"
else
printf "$greet does not start with a digit(s)\n"
fi
変数 $greet
の文字列は数字で始まらないため、bash 演算子は 1
を返します。スクリプトは、以下に示す出力を出力します。
Hello,World!123 does not start with a digit(s)
Bash で文字列の末尾を正規表現でマッチさせる
以下のスクリプトは、$greet
変数の値が数字で終わっているかどうかを確認します。$
は、文字列の最後の文字と一致するように指定するために使用されます。
出力される出力は、マッチング演算子によって返される値によって異なります。
#!/bin/env bash
greet="Hello,World!123"
if [[ $greet =~ [0-9]$ ]]; then
printf "$greet ends with a digit(s).\n"
else
printf "$greet does not end with a digit(s)\n"
fi
$greet
変数の文字列値は数字で終わります。再一致演算子は 0
を返し、スクリプトは以下の出力を出力します。
Hello,World!123 ends with a digit(s).
以下のスクリプトに示すように、$greet
変数の値を変更してみましょう。
#!/bin/env bash
greet="123Hello,World!"
if [[ $greet =~ [0-9]$ ]]; then
printf "$greet ends with a digit(s).\n"
else
printf "$greet does not end with a digit(s)\n"
fi
変数 $greet
の文字列は 1つまたは複数の数字で終わっていないため、再一致演算子は 1
を返し、スクリプトは以下の出力を出力します。
123Hello,World! does not end with a digit(s)
Bash での電子メールのリージェックスマッチ
メールを照合するには、この^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$
正規表現パターンが一般的に使用されます。
#!/bin/env bash
email="example@delftstack.com"
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then
printf "$email is a valid email.\n"
else
printf "$email is not a valid email.\n"
fi
以下の出力は、チェックされ、チェックに合格した電子メールを示しています。
example@delftstack.com is a valid email.
以下に示すように、電子メールの最後にある .com
を削除して、スクリプトを実行しましょう。
#!/bin/env bash
email="example@delftstack"
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then
printf "$email is a valid email.\n"
else
printf "$email is not a valid email.\n"
fi
最後の部分である .com
がないため、電子メールはテストに失敗します。
example@delftstack is not a valid email.