pipipipi.net

pipipipi.net

約7分で読めます

正規表現入門 — 実用パターンですぐ使えるようになる

正規表現入門 — 実用パターンですぐ使えるようになる

大量のログから特定の行だけ抜き出したい、テキストエディタで似たパターンの文字列をまとめて置換したい——そんなとき力を発揮するのが正規表現です。「なんとなく使っているけど記号の意味を正確には説明できない」という人も多いのではないでしょうか。

この記事では正規表現の基本メタ文字から、メールアドレスや日付など実務でよく使うパターンまでをまとめました。パターンはすべて動作確認済みです。

正規表現とは

正規表現(Regular Expression)は、文字列のパターンを記号の組み合わせで表現する仕組みです。主な用途は次の3つです。

  • 検索: 「特定のパターンに一致する文字列があるか」を調べる
  • 置換: 一致した部分を別の文字列に置き換える
  • バリデーション: 入力値が期待する形式かどうかをチェックする

VSCodeの検索機能、JavaScriptやPythonなどのプログラミング言語、Linuxのgrepやsedなど、ほぼすべての開発環境で共通して使えます。

基本メタ文字

メタ文字意味
.改行以外の任意の1文字
*直前の文字の0回以上の繰り返し
+直前の文字の1回以上の繰り返し
?直前の文字の0回または1回(存在してもしなくてもよい)
[]角括弧内のいずれか1文字(文字クラス)
{}直前の文字の繰り返し回数を指定(例: {2,4}は2〜4回)
^行または文字列の先頭
$行または文字列の末尾
|OR条件(いずれかに一致)
\直後の記号をメタ文字ではなく普通の文字として扱う(エスケープ)

例えば ab*c は「a」の後に「b」が0回以上続き最後に「c」が来るパターンなので、“ac”、“abc”、“abbbc” のいずれにも一致します。一方 ab+c は「b」が最低1回必要なので “ac” には一致しません。

角括弧 [] の中でハイフンを使うと範囲指定になります。[a-z] は小文字アルファベット1文字、[0-9] は半角数字1文字です。角括弧の先頭に ^ を置くと否定(それ以外の文字)を意味します。[^0-9] は数字以外の1文字です。

文字クラス

よく使う文字クラスには、対応する否定形(大文字版)が用意されています。

文字クラス意味否定形意味
\d数字1文字 [0-9]\D数字以外の1文字
\w単語構成文字(英数字とアンダースコア)[A-Za-z0-9_]\Wそれ以外の1文字
\s空白文字(半角スペース・タブ・改行など)\S空白以外の1文字

\d{3}-\d{4} と書けば「数字3桁・ハイフン・数字4桁」という郵便番号のようなパターンを短く表現できます。

グループと後方参照

丸括弧 () で囲んだ部分はグループとして扱われ、後から番号で参照できます。

  • グループ化: (abc)+ のように括弧でまとめると、“abc”全体の繰り返しを指定できる
  • 後方参照: \1、\2(言語によっては$1、$2)で、n番目のグループに一致した文字列を再利用できる
  • 名前付きグループ: (?P…)(Pythonの場合)や(?…)(JavaScriptの場合)で、番号の代わりに名前で参照できる

後方参照は「同じ単語が連続している箇所を見つける」ような場合に便利です。Pythonで確認すると次のようになります。

import re
text = "これは これは テストです"
match = re.search(r"(\w+)\s+\1", text)
print(match.group())  # → "これは これは"

パターン (\w+) で1つ目の単語をグループとして捉え、\1 で「同じ単語がもう一度出てくる」ことを要求しています。

実用パターン例

メールアドレス検証

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

「@より前は英数字と一部の記号」「@の後はドメイン名」「最後にドット区切りで2文字以上のトップレベルドメイン」という構造をチェックします。ただしRFC準拠の完全なメールアドレス検証は例外が非常に多く正規表現だけでは困難なので、実務では「明らかにおかしい入力を弾く」程度の用途に留め、最終的な確認は確認メール送信などで行うのが安全です。

URL抽出

https?:\/\/[\w\-.\/?=&%#]+

文章中からURLをまとめて抜き出すパターンです。https?は「httpの後のsが0回または1回」という意味なので、httpとhttpsの両方に一致します。

const text = "詳細は https://example.com/page?id=1 を参照。";
const urls = text.match(/https?:\/\/[\w\-.\/?=&%#]+/g);
console.log(urls); // ["https://example.com/page?id=1"]

日付フォーマット確認(YYYY-MM-DD)

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$

年は4桁、月は01〜12、日は01〜31の範囲に収まっているかをチェックします。注意点として、この正規表現は「2月30日」のような形式は正しいが実在しない日付までは弾けません。うるう年や月ごとの日数まで検証したい場合は、正規表現で形式チェックをした後にプログラム側で日付オブジェクトに変換して実在確認する(例: JavaScriptならDateオブジェクト、Pythonならdatetimeモジュール)のが確実です。

電話番号(日本)ハイフンあり/なし

^0\d{1,4}-?\d{1,4}-?\d{4}$

先頭が0で始まり、市外局番・市内局番・番号の間にハイフンがあってもなくても一致するパターンです。090-1234-5678、09012345678、03-1234-5678のいずれにも対応します。日本の電話番号は市外局番の桁数が地域によって1〜5桁とばらつきがあるため、ハイフン区切り位置を厳密に検証するパターンは複雑になりがちです。「形式として妥当か」の緩いチェック用途に向いています。

全角/半角数字の統一

フォーム入力などで全角数字が混ざっていると集計処理に困ることがあります。JavaScriptでは文字コードの差分を使って変換できます。

const fullwidth = "0123456789";
const halfwidth = fullwidth.replace(/[0-9]/g, c =>
  String.fromCharCode(c.charCodeAt(0) - 0xFEE0)
);
console.log(halfwidth); // "0123456789"

全角数字(0〜9)と半角数字(0〜9)の文字コードは一定の差(0xFEE0)があるため、この差分を引くことで変換できます。

VSCodeでの正規表現検索・置換

VSCodeの検索パネル(Ctrl+F または検索アイコン)には、入力欄の右側に .* というアイコンがあり、これをクリックするか Alt+R を押すと正規表現モードに切り替わります。ファイル全体を対象にした検索・置換(Ctrl+Shift+H)でも同様に有効化できます。

正規表現モードでは、括弧でグループ化した部分を置換欄で $1、$2 のように参照できます。例えば検索欄に (\w+)@(\w+) と入力し、置換欄に $2 at $1 と入力すると、「name@domain」という並びを「domain at name」の順に入れ替えられます。置換欄では \U$1(大文字化)や \L$1(小文字化)といった大文字小文字変換も使えます。

JavaScript / Python での使い方の要点

JavaScriptでは、正規表現リテラル /pattern/flags か、動的にパターンを組み立てたい場合は new RegExp() を使います。主なメソッドは次の通りです。

  • test(): 一致するかどうかをtrue/falseで返す
  • match(): 一致した文字列を取得(gフラグで全件取得)
  • replace(): 一致部分を置換
  • exec(): 1件ずつ一致情報を取得(グループの位置なども取れる)

Pythonではreモジュールを使います。

  • re.match(): 文字列の先頭からのマッチを試みる
  • re.search(): 文字列中のどこかにマッチする箇所を探す
  • re.findall(): すべての一致を取得
  • re.sub(): 一致部分を置換

Pythonでは同じパターンを何度も使う場合、re.compile()で事前にコンパイルしておくと、繰り返し利用時のオーバーヘッドを抑えられます。

import re
pattern = re.compile(r"^\d{4}-\d{2}-\d{2}$")
print(bool(pattern.match("2026-07-02")))  # True

両言語とも共通のメタ文字・文字クラスがベースになっているので、片方を覚えればもう片方への応用は難しくありません。

まとめ

正規表現は . * + ? などの基本メタ文字と \d \w \s の文字クラスさえ押さえれば、大半のパターンは組み立てられます。メールアドレスや日付のような「形式は決まっているが完全な検証は難しい」パターンは、正規表現で大まかにチェックした上で、必要ならプログラム側で追加検証するという役割分担が実務では現実的です。VSCodeの検索・置換でも同じ記法がそのまま使えるので、まずは普段のテキスト編集で試してみると感覚がつかみやすくなります。

関連記事