正規表現はテキストの検索・検証・変換が必要なときに毎回役立つスキルです。このチートシートは最もよく使われるパターンを実例とともにまとめており、すぐにテストできます。
ライブ正規表現テスターを開く →
文字クラス
| パターン | マッチするもの |
|---|
. | 改行以外の任意の文字 |
\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 | ドットオール — .が改行にもマッチ |
u | Unicodeモード |
/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 正規表現テスター →
- パターンとテスト文字列を貼り付ける
- マッチがリアルタイムでハイライト表示される
- フラグ対応:
g、i、m、s
- キャプチャグループの結果を表示
デバッグのヒント
- シンプルから始める — パターンを少しずつ組み立てる
- Pythonでは生文字列を使う —
r'\d+'でダブルエスケープを避ける
- 特殊文字をエスケープする —
.・*・+・?・(・)・[・]・{・}・^・$・|・\はリテラルとして使う場合にエスケープが必要
- 意図するときはアンカーを使う —
/\d+/はどこの数字にもマッチするが、/^\d+$/は文字列全体が数字である必要がある
- 境界ケースでテストする — 空文字列、全マッチ、マッチなし、重複するパターン
正規表現は強力ですが、すぐに読みにくくなります。パターンが60文字を超えるようなら、名前付きサブパターンに分割するかパーサーライブラリの使用を検討してください。
ZeroTool 正規表現テスターで今すぐ試す →