正規表現はテキストの検索・検証・変換が必要なときに毎回役立つスキルです。このチートシートは最もよく使われるパターンを実例とともにまとめており、すぐにテストできます。

ライブ正規表現テスターを開く →

文字クラス

パターンマッチするもの
.改行以外の任意の文字
\d数字 [0-9]
\D数字以外
\w単語文字 [a-zA-Z0-9_]
\W非単語文字
\s空白(スペース、タブ、改行)
\S非空白
[abc]a、b、cのどれか
[^abc]a、b、c以外
[a-z]小文字aからz
[A-Z]大文字AからZ
[0-9]数字0から9

アンカー

パターンマッチするもの
^文字列(または複数行モードでは行)の先頭
$文字列(または複数行モードでは行)の末尾
\b単語境界
\B非単語境界
/^\d{5}$/    → ちょうど5桁の郵便番号にマッチ
/\bword\b/   → "word"にマッチするが"password"にはマッチしない

量指定子

パターン意味
*0回以上
+1回以上
?0回または1回(省略可能)
{n}ちょうどn回
{n,}n回以上
{n,m}n回以上m回以下

貪欲マッチと遅延マッチ: デフォルトでは量指定子は貪欲(できるだけ多くマッチ)です。?を追加すると遅延になります:

<.+>    → 貪欲:<b>bold</b>全体にマッチ
<.+?>   → 遅延:<b>と</b>に別々にマッチ

グループと選択

パターン意味
(abc)キャプチャグループ
(?:abc)非キャプチャグループ
a|b選択:aまたはb
\1グループ1への後方参照
// 日付文字列から年・月・日を抽出
const match = '2026-04-07'.match(/(\d{4})-(\d{2})-(\d{2})/);
// match[1] = '2026', match[2] = '04', match[3] = '07'

先読みと後読み

パターン意味
(?=abc)肯定先読み — abcが続く
(?!abc)否定先読み — abcが続かない
(?<=abc)肯定後読み — abcが先行する
(?<!abc)否定後読み — abcが先行しない
/\d+(?= dollars)/   → " dollars"が続く場合のみ数字にマッチ
/(?<=\$)\d+/        → "$"が先行する場合のみ数字にマッチ

後読みはJavaScriptではES2018以降で使用可能です。

フラグ

フラグ効果
i大文字小文字を区別しない
gグローバル — すべてのマッチを検索
m複数行 — ^$が行境界にマッチ
sドットオール — .が改行にもマッチ
uUnicodeモード
/hello/i.test('Hello World')  // true
'abc abc'.match(/abc/g)       // ['abc', 'abc']

よく使うパターン集

メールアドレス(基本)

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

URL

/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)/

IPv4アドレス

/^(\d{1,3}\.){3}\d{1,3}$/

16進カラーコード

/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/

日本の郵便番号

/^\d{3}-?\d{4}$/

スラッグ(URLフレンドリーな文字列)

/^[a-z0-9]+(?:-[a-z0-9]+)*$/

セマンティックバージョン

/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([\da-zA-Z-]+(?:\.[\da-zA-Z-]+)*))?(?:\+([\da-zA-Z-]+(?:\.[\da-zA-Z-]+)*))?$/

コードでの正規表現の使い方

JavaScript

// 文字列がマッチするかテスト
/^\d+$/.test('123')       // true
/^\d+$/.test('12a')       // false

// 最初のマッチを検索
'hello world'.match(/\w+/)    // ['hello']

// すべてのマッチを検索
'hello world'.match(/\w+/g)   // ['hello', 'world']

// 置換
'foo bar'.replace(/\b\w/g, c => c.toUpperCase())  // 'Foo Bar'

// 分割
'one, two,three'.split(/,\s*/)  // ['one', 'two', 'three']

Python

import re

# テスト
bool(re.match(r'^\d+$', '123'))        # True

# 最初のマッチを検索
re.search(r'\d+', 'abc123def')         # マッチオブジェクト
re.search(r'\d+', 'abc123def').group() # '123'

# すべてのマッチを検索
re.findall(r'\d+', 'a1 b22 c333')      # ['1', '22', '333']

# 置換
re.sub(r'\s+', '-', 'hello world')     # 'hello-world'

ライブでテストする

パターンを書いたらリリース前にテストしましょう — エッジケースを見落としやすいです。

ZeroTool 正規表現テスター →

  • パターンとテスト文字列を貼り付ける
  • マッチがリアルタイムでハイライト表示される
  • フラグ対応:gims
  • キャプチャグループの結果を表示

デバッグのヒント

  1. シンプルから始める — パターンを少しずつ組み立てる
  2. Pythonでは生文字列を使うr'\d+'でダブルエスケープを避ける
  3. 特殊文字をエスケープする.*+?()[]{}^$|\はリテラルとして使う場合にエスケープが必要
  4. 意図するときはアンカーを使う/\d+/はどこの数字にもマッチするが、/^\d+$/は文字列全体が数字である必要がある
  5. 境界ケースでテストする — 空文字列、全マッチ、マッチなし、重複するパターン

正規表現は強力ですが、すぐに読みにくくなります。パターンが60文字を超えるようなら、名前付きサブパターンに分割するかパーサーライブラリの使用を検討してください。

ZeroTool 正規表現テスターで今すぐ試す →