正規表現チートシート

中級 | 15分 で読める | 2025.01.10

公式ドキュメント

この記事の要点

\d(数字)、\w(単語文字)、\s(空白)が基本の文字クラス
*(0回以上)、+(1回以上)、?(0か1回)の量指定子
• キャプチャグループと先読み・後読みで高度なパターンマッチ

基本的なメタ文字

パターン説明
.任意の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+\/>)

全角文字

[^\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")

参考リソース

関連記事

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る