概要
正規表現は、文字列の検索・抽出・置換に使うパターン記法です。このチートシートでは、メタ文字、文字クラス、量指定子、グループ化、先読み・後読み、JavaScript / Python での使い方を整理します。
最初に覚える最小セット
| パターン | 用途 |
|---|---|
. | 任意の1文字 |
^ / $ | 行頭 / 行末 |
\d / \w / \s | 数字 / 単語文字 / 空白 |
* / + / ? | 繰り返し |
{n,m} | 回数指定 |
( ... ) | グループ化 |
(?: ... ) | 非キャプチャグループ |
| | OR |
正規表現は、まず小さいパターンを作って実例で確認し、対象外の文字列にもマッチしないかを必ず試します。メール、URL、HTML の完全な解析は正規表現だけに頼りすぎないようにします。
基本的なメタ文字
| パターン | 説明 | 例 |
|---|---|---|
. | 任意の1文字(改行以外) | a.c → abc, aXc |
^ | 行頭 | ^Hello |
$ | 行末 | World$ |
\ | エスケープ | \. → ピリオド |
| | OR(いずれか) | cat|dog |
文字クラス
| パターン | 説明 | 例 |
|---|---|---|
[abc] | a, b, c のいずれか | [aeiou] → 母音 |
[^abc] | a, b, c 以外 | [^0-9] → 数字以外 |
[a-z] | a〜zの範囲 | [A-Za-z] → 英字 |
[0-9] | 0〜9の範囲 | [0-9]+ → 数字 |
特殊文字クラス
| パターン | 説明 | 等価 |
|---|---|---|
\d | 数字 | [0-9] |
\D | 数字以外 | [^0-9] |
\w | 単語文字 | [A-Za-z0-9_] |
\W | 単語文字以外 | [^A-Za-z0-9_] |
\s | 空白文字 | [ \t\n\r\f] |
\S | 空白以外 | [^ \t\n\r\f] |
\b | 単語境界 | \bword\b |
\B | 単語境界以外 |
ポイント: \d・\w・\sの3つを覚えれば大半のパターンが書けます。大文字(\D,\W,\S)はそれぞれの否定です。
量指定子
| パターン | 説明 | 例 |
|---|---|---|
* | 0回以上 | a* → "", a, aa, aaa |
+ | 1回以上 | a+ → a, aa, aaa |
? | 0回または1回 | colou?r → color, colour |
{n} | ちょうどn回 | a{3} → aaa |
{n,} | n回以上 | a{2,} → aa, aaa, aaaa |
{n,m} | n〜m回 | a{2,4} → aa, aaa, aaaa |
最短マッチ(非貪欲)
| パターン | 説明 |
|---|---|
*? | 0回以上(最短) |
+? | 1回以上(最短) |
?? | 0回または1回(最短) |
{n,m}? | n〜m回(最短) |
// 貪欲(デフォルト)
"<div>a</div><div>b</div>".match(/<div>.*<\/div>/);
// "<div>a</div><div>b</div>"
// 非貪欲
"<div>a</div><div>b</div>".match(/<div>.*?<\/div>/);
// "<div>a</div>"
注意: *と+はデフォルトで貪欲マッチ(最長一致)です。HTMLタグなどの短いマッチが必要な場合は*?や+?(非貪欲)を使いましょう。
グループ化
| パターン | 説明 | 例 |
|---|---|---|
(abc) | キャプチャグループ | (\d+)-(\d+) |
(?:abc) | 非キャプチャグループ | (?:https?|ftp):// |
(?<name>abc) | 名前付きグループ | (?<year>\d{4}) |
\1, \2 | 後方参照 | (\w+)\s\1 → word word |
// キャプチャグループ
const match = "2025-01-10".match(/(\d{4})-(\d{2})-(\d{2})/);
// match[1] = "2025", match[2] = "01", match[3] = "10"
// 名前付きグループ
const match = "2025-01-10".match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/);
// match.groups.year = "2025"
実践メモ: 名前付きグループ((?<year>\d{4}))を使うと、match.groups.yearのように意味のある名前でアクセスでき、コードが読みやすくなります。
先読み・後読み
| パターン | 説明 | 例 |
|---|---|---|
(?=abc) | 肯定先読み | \d+(?=円) → “100”円 |
(?!abc) | 否定先読み | \d+(?!円) → 100ドル |
(?<=abc) | 肯定後読み | (?<=\$)\d+ → $“100” |
(?<!abc) | 否定後読み | (?<!\$)\d+ |
// 先読み:後ろに「円」がある数字
"100円 200ドル".match(/\d+(?=円)/g); // ["100"]
// 後読み:前に「$」がある数字
"$100 200円".match(/(?<=\$)\d+/g); // ["100"]
フラグ
| フラグ | 説明 |
|---|---|
g | グローバル(全てにマッチ) |
i | 大文字小文字を区別しない |
m | 複数行モード(^$が各行に) |
s | .が改行にもマッチ |
u | Unicode対応 |
// 複数のフラグ
/pattern/gi
// 大文字小文字無視
"Hello WORLD".match(/hello/i); // ["Hello"]
// グローバル
"a1b2c3".match(/\d/g); // ["1", "2", "3"]
ポイント: 先読み((?=...))と後読み((?<=...))はマッチ位置を消費しません。「前後の条件を指定するが、その部分はマッチに含めない」ときに使います。
注意: 後読み(lookbehind)はブラウザによってサポート状況が異なります。古いSafariでは動作しない場合があるため、対応ブラウザを確認しましょう。
よく使うパターン
メールアドレス
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
URL
https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)
電話番号(日本)
0\d{1,4}-?\d{1,4}-?\d{4}
郵便番号(日本)
^\d{3}-?\d{4}$
日付(YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
IPアドレス
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
パスワード(8文字以上、英大小数字含む)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$
HTMLタグ
<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)
注意: HTML は入れ子や属性の揺れがあるため、実務では正規表現だけで完全に解析しないでください。DOM パーサーや HTML パーサーを使うほうが安全です。
全角文字
[^\x01-\x7E]
日本語(ひらがな・カタカナ・漢字)
[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]
実践メモ: 正規表現のテストにはregex101.comが便利。パターンの各部分の説明やマッチ結果をリアルタイムで確認できます。
JavaScript での使用
| 操作 | コード |
|---|---|
| テスト | /\d+/.test("abc123"); // true |
| マッチ | "hello123world456".match(/\d+/g); // ["123", "456"] |
| 置換 | "hello world".replace(/world/, "JavaScript");"a1b2c3".replace(/\d/g, "X"); // "aXbXcX" |
| 分割 | "a,b;c".split(/[,;]/); // ["a", "b", "c"] |
| 検索 | "hello world".search(/world/); // 6 |
Python での使用
| 操作 | コード |
|---|---|
| マッチ | re.match(r"\d+", "123abc") # 先頭のみre.search(r"\d+", "abc123") # 最初の1つre.findall(r"\d+", "a1b2c3") # 全て |
| 置換 | re.sub(r"\d+", "X", "a1b2c3") # "aXbXcX" |
| 分割 | re.split(r"[,;]", "a,b;c") # ["a", "b", "c"] |
| コンパイル | pattern = re.compile(r"\d+")pattern.findall("a1b2c3") |
まとめ
正規表現は、文字クラス、量指定子、グループ化、フラグを組み合わせて少しずつ作るのが安全です。貪欲マッチ、後読みの対応状況、複雑すぎる URL / HTML パターンには注意します。
言語ごとに正規表現エンジンの機能が異なるため、JavaScript と Python の差は公式ドキュメントで確認してください。
参考リソース
- MDN: Regular expressions - JavaScript 正規表現ガイド
- MDN: RegExp Reference - RegExp オブジェクト
- Python re module - Python 正規表現公式ドキュメント
- regex101 - オンラインで正規表現をテスト
関連記事
- bashチートシート - シェルでの正規表現
- Pythonチートシート - Python正規表現