正規表現チートシート

中級 | 15分 で読める | 2025.01.10

公式ドキュメント

概要

正規表現は、文字列の検索・抽出・置換に使うパターン記法です。このチートシートでは、メタ文字、文字クラス、量指定子、グループ化、先読み・後読み、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.が改行にもマッチ
uUnicode対応
// 複数のフラグ
/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 の差は公式ドキュメントで確認してください。

参考リソース

関連記事

← 一覧に戻る
PR
PR
PR
PR