正規表現とは

正規表現(Regular Expression、略してregex)は、文字列のパターンを表現するための記法です。

たとえば「3桁の数字」を探したいとき、正規表現なら \d{3} と書くだけで済みます。テキストの検索・置換・バリデーションなど、プログラミングから日常作業まで幅広く使えます。

基本的な記法

メタ文字

記号意味マッチ
.任意の1文字a.cabc, aXc, a1c
\d数字(0-9)\d{3}123, 456
\w英数字+アンダースコア\w+hello, test_1
\s空白文字a\sba b
^行の先頭^Hello行頭のHello
$行の末尾end$行末のend

量指定子

記号意味マッチ
*0回以上ab*cac, abc, abbc
+1回以上ab+cabc, abbc(acは×)
?0回か1回colou?rcolor, colour
{n}ちょうどn回\d{4}2026
{n,m}n回以上m回以下\d{2,4}12, 123, 1234

グループとOR

記号意味マッチ
(...)グループ化(ab)+ab, abab
[...]文字クラス[aeiou]a, e, i, o, u
[^...]否定文字クラス[^0-9]数字以外
|ORcat|dogcat, dog

よく使う正規表現パターン集

以下のパターンは正規表現テスターでコピペして試せます。

メールアドレス

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

RFC準拠の完全な正規表現は非常に長くなるため、実用上はこのパターンで十分です。

電話番号(日本)

0\d{1,4}-?\d{1,4}-?\d{3,4}

03-1234-5678090-1234-56780312345678(ハイフンなし)のいずれにもマッチします。

郵便番号

\d{3}-?\d{4}

123-45671234567 の両方にマッチします。

URL

https?://[\w/:%#\$&\?\(\)~\.=\+\-]+

http://https:// の両方に対応します。

IPアドレス(IPv4)

\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b

0.0.0.0〜255.255.255.255の範囲で正しいIPアドレスにマッチします。

日付(YYYY-MM-DD)

\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])

2026-03-21 のような日付にマッチします。月や日の範囲もチェックします。

日本語の全角文字

[ぁ-んァ-ヶ亜-熙A-Za-z0-9]+

ひらがな・カタカナ・漢字・全角英数にマッチします。

HTMLタグ

<[^>]+>

HTMLタグにマッチします。ただしネストしたタグの解析には正規表現は向いていません。HTMLパーサーの使用を推奨します。

実践テクニック

先読み・後読み

記法名称意味
(?=...)肯定先読み…が後に続く位置にマッチ
(?!...)否定先読み…が後に続かない位置にマッチ
(?<=...)肯定後読み…が前にある位置にマッチ
(?<!...)否定後読み…が前にない位置にマッチ

: パスワードのバリデーション(8文字以上、大文字・小文字・数字を含む)

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$

安全なパスワードの作り方はパスワード生成ツールの記事も参考にしてください。

非貪欲マッチ

デフォルトでは、*+できるだけ多くマッチします(貪欲マッチ)。? を付けるとできるだけ少なくマッチします。

# 貪欲: <b>太字</b>と<b>太字</b> 全体にマッチ
<b>.*</b>

# 非貪欲: <b>太字</b> 個別にマッチ
<b>.*?</b>

名前付きキャプチャ

(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})

グループに名前を付けると、コードから参照しやすくなります。

正規表現をテストする方法

正規表現は書いてみないと動作がわかりにくいものです。Assistyの正規表現テスターを使えば、以下のことがリアルタイムで確認できます。

  • パターンがどこにマッチするかハイライト表示
  • マッチした文字列の一覧
  • キャプチャグループの中身
  • 各種フラグ(g, i, m)の切り替え

言語別の正規表現関数

JavaScript

// テスト
/\d+/.test("abc123"); // true

// マッチ
"abc123".match(/\d+/); // ["123"]

// 置換
"hello world".replace(/world/, "regex"); // "hello regex"

Python

import re

# テスト
re.search(r'\d+', 'abc123')  # <Match object>

# 全マッチ
re.findall(r'\d+', 'abc123def456')  # ['123', '456']

# 置換
re.sub(r'\d+', 'X', 'abc123')  # 'abcX'

よくある落とし穴

1. エスケープ忘れ

. は「任意の1文字」なので、ピリオドそのものにマッチさせるには \. と書く必要があります。

# NG: example.com にも exampleXcom にもマッチ
example.com

# OK: example.com のみ
example\.com

2. 文字クラス内のハイフン

[a-z]- は範囲を意味します。ハイフンそのものにマッチさせるには先頭か末尾に置きます。

# NG: 意図しない範囲指定
[a-z-A]

# OK
[-a-zA-Z]

3. 改行をまたぐマッチ

. はデフォルトで改行にマッチしません。改行を含めたい場合は [\s\S] を使います。

まとめ

正規表現は、覚えれば覚えるほど作業効率が上がる強力なツールです。まずは基本的なメタ文字と量指定子を覚えて、正規表現テスターで実際に試しながら学ぶのが最速です。

この記事で紹介したパターンをコピペして、テスターで動作を確認してみてください。

この記事の内容はAssisty正規表現テスターで実際にお試しいただけます。