Rundevlog

小さい会社のしがないエンジニアのブログ

2025.3.20

正規表現の基本

正規表現とは

正規表現とは、文字列をパターンとして表現する方法。

例えば、入力された文字列が郵便番号(7桁の数字)かどうかを判定したい時、こんなif文を書くだろうか。

  • 入力された文字列が7桁かどうかを判定する
  • 各桁がそれぞれ0〜9かどうかを判定する

各桁の数字を判定するとなると、7回if文を繰り返すだろうが、このプログラムは冗長的に感じる。

「7桁の数字」と文字列をパターン化できる時に使用するのが正規表現になる。

7桁の数字を表すのに正規表現では、下記のようにシンプルに判定することができる。

regexコピーする編集する^[0-9]{7}$

また、ハイフンがある場合でも下記のように表現できる。

regexコピーする編集する^[0-9]{3}-[0-9]{4}$

基本的な正規表現の書き方

正規表現は記号の組み合わせでできている。
それぞれに意味があるので、よく使うやつだけピックアップして覚えておくと便利。

記号・構文意味備考
.任意の1文字改行以外の1文字にマッチ
+直前の文字を1回以上繰り返す最長一致
*直前の文字を0回以上繰り返す最長一致
?直前の文字が0回か1回最長一致(省略可)
+?直前の文字を1回以上繰り返す(最短一致)欲張りすぎない
*?直前の文字を0回以上繰り返す(最短一致)
??直前の文字が0回か1回(最短一致)
``OR条件(いずれかにマッチ)
\エスケープ記号を文字として扱う
[...]カッコ内のどれか1文字にマッチ例:[abc] → a or b or c
[^...]カッコ内以外の1文字にマッチ例:[^0-9] → 数字以外
(abc)グルーピング部分マッチに使える
{n}n回だけ繰り返す
{n,}n回以上繰り返す上限なし
{n,m}n回以上m回以下最長一致
{n,m}?n回以上m回以下(最短一致)

具体例いろいろ

いくつか実際によくあるパターンを例として挙げておく。

メールアドレスっぽい文字列の判定(超ざっくり)

regexコピーする編集する^[^@\s]+@[^@\s]+\.[^@\s]+$

かなり雑だけど、「@があってドメインっぽい形」ぐらいはこれでわかる。
本気で厳密にやると大変なので、アプリ側でバリデーションと併用するのが基本。

電話番号(ハイフン付き)

regexコピーする編集する^\d{2,4}-\d{2,4}-\d{4}$

市外局番の桁数がバラバラなので柔軟に見たい場合はこんな書き方になる。
あくまで見た目のチェック。

日付(YYYY-MM-DD)

rコピーする編集する^\d{4}-\d{2}-\d{2}$

日付の構造は合ってるかを判定する程度ならこれでOK。
2月30日などの不正日付までは検知できないので、そこはプログラム側でやる。