オンライン正規表現テスターを使えば、正規表現を書いてサンプルテキストを貼り付け、マッチをリアルタイムでハイライト表示できます — IDE不要、ターミナル不要、試行錯誤のコミットサイクル不要。「もう少しで動く」正規表現のデバッグは開発で最も辛い体験の一つですが、インタラクティブなテスターを使えば視覚的で分かりやすいプロセスになります。
オンライン正規表現テスターを使う理由
正規表現は暗記から読み書きするのが難しいことで有名です。オンラインテスターを使うと:
- 即時フィードバック — 入力しながらテキストのどの部分がマッチするかを確認
- フラグ制御 — コードを書き直さずに
g、i、m、sフラグをトグル - キャプチャグループの確認 — 各
()グループがキャプチャした内容を正確に確認 - 安全な反復 — プロダクションコードに触れずに実験
正規表現フラグ
フラグはパターンのマッチ方法を変えます。これらを理解することで最も一般的な正規表現のバグを防げます:
| フラグ | 意味 |
|---|---|
g | グローバル — 最初だけでなくすべてのマッチを検索 |
i | 大文字小文字を区別しない — [A-Z] が [a-z] にもマッチ |
m | 複数行 — ^ と $ が各行の始まり/終わりにマッチ |
s | ドット全部 — . が改行文字にもマッチ |
u | Unicode — 完全なUnicodeマッチングを有効化 |
d | インデックス — マッチグループの開始/終了インデックスを含める |
最も一般的なミス:複数のマッチを期待するときに g フラグを忘れること。
コア正規表現構文
文字クラス
\d — 任意の数字 [0-9]
\D — 数字以外
\w — 単語文字 [a-zA-Z0-9_]
\W — 非単語文字
\s — 空白(スペース、タブ、改行)
\S — 非空白
. — 改行以外の任意の文字(sフラグで改行も含む)
[abc] — 文字クラス: a、b、またはc
[^abc] — 否定クラス: a、b、c以外
[a-z] — 範囲: 小文字のaからz
[a-zA-Z] — 範囲: 任意の文字
量指定子
* — 0回以上(貪欲)
+ — 1回以上(貪欲)
? — 0または1回(オプション)
{3} — 正確に3回
{3,} — 3回以上
{3,6} — 3〜6回(両端含む)
*? — 0回以上(怠惰/非貪欲)
+? — 1回以上(怠惰/非貪欲)
貪欲 vs 怠惰:<a>foo</a> に対する <.+> は文字列全体にマッチします。<.+?> は <a> と </a> に別々にマッチします。
アンカー
^ — 文字列の始まり(mフラグで各行の始まり)
$ — 文字列の終わり(mフラグで各行の終わり)
\b — 単語境界
\B — 非単語境界
グループとキャプチャ
(abc) — キャプチャグループ: "abc"をグループ1としてキャプチャ
(?:abc) — 非キャプチャグループ: グループ化するがキャプチャしない
(?<name>abc) — 名前付きキャプチャグループ: groups.nameとしてアクセス
(a|b) — 選択: "a"または"b"にマッチ
先読みと後読み
(?=abc) — 肯定先読み: "abc"が後に続く
(?!abc) — 否定先読み: "abc"が後に続かない
(?<=abc) — 肯定後読み: "abc"が前にある
(?<!abc) — 否定後読み: "abc"が前にない
先読み/後読みは文字ではなく位置にマッチします — 入力を消費しません。
実用的な正規表現パターン
メールアドレスの検証
^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$
一般的なケースをカバーします。完全なRFC 5321準拠のメール正規表現は非現実的です — 本番環境では、ライブラリかシンプルな形式チェック+確認メールを使用してください。
URLマッチング
https?:\/\/[^\s/$.?#].[^\s]*
http:// と https:// URLにマッチします。より厳格な検証:
^(https?:\/\/)([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,}(\/[^\s]*)?$
IPv4アドレス
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
各オクテットが0〜255であることを検証します。
セマンティックバージョン(semver)
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z\-][0-9a-zA-Z\-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z\-][0-9a-zA-Z\-]*))*))?(?:\+([0-9a-zA-Z\-]+(?:\.[0-9a-zA-Z\-]+)*))?$
プレリリースとビルドメタデータを含む完全なsemver準拠。
ISO 8601日付
^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$
基本的な範囲検証付きの YYYY-MM-DD フォーマットにマッチします。
テキストから数値を抽出
-?\d+(?:\.\d+)?
整数と小数点付き数値(オプションで負数)にマッチします。ログ出力や設定ファイルのパースに便利です。
16進数カラーコード
#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\b
3桁(#fff)と6桁(#ffffff)の両方の16進数カラーにマッチします。
ログ行のパース
^(?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\s+(?<level>ERROR|WARN|INFO|DEBUG)\s+(?<message>.+)$
名前付きキャプチャグループを使って、非構造化ログ行から構造化データを取得します。
コードでの正規表現
JavaScript
// 基本マッチ
const email = '[email protected]';
const pattern = /^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/;
console.log(pattern.test(email)); // true
// すべてのマッチを抽出(gフラグが必要)
const text = 'Prices: $12.50, $199, $0.99';
const prices = text.match(/\$\d+(?:\.\d{2})?/g);
// ['$12.50', '$199', '$0.99']
// 名前付きキャプチャグループ
const log = '2026-04-07T14:23:01 ERROR connection refused';
const logPattern = /^(?<ts>\S+)\s+(?<level>\w+)\s+(?<msg>.+)$/;
const { ts, level, msg } = log.match(logPattern).groups;
// バック参照を使った置換
const camelToSnake = str => str.replace(/([A-Z])/g, '_$1').toLowerCase();
camelToSnake('camelCaseString'); // 'camel_case_string'
Python
import re
# 検索と抽出
text = "Order #12345 placed on 2026-04-07"
m = re.search(r'#(\d+)', text)
if m:
print(m.group(1)) # '12345'
# すべてのマッチを検索
emails = re.findall(r'[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}', text)
# 名前付きグループ
pattern = re.compile(
r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
)
m = pattern.search(text)
print(m.group('year'), m.group('month'), m.group('day'))
# 置換
result = re.sub(r'\b(\w+)\b', lambda m: m.group().upper(), 'hello world')
# 'HELLO WORLD'
Go
import "regexp"
// 一度コンパイルして再利用
emailRe := regexp.MustCompile(`^[\w.%+\-]+@[\w\-]+\.[a-zA-Z]{2,}$`)
fmt.Println(emailRe.MatchString("[email protected]")) // true
// すべて検索
re := regexp.MustCompile(`\$\d+(?:\.\d{2})?`)
matches := re.FindAllString("Prices: $12.50 and $199", -1)
// ["$12.50", "$199"]
// 名前付きサブマッチ
re = regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})`)
match := re.FindStringSubmatch("2026-04")
names := re.SubexpNames()
// namesを反復してマッチに名前をマップ
一般的な正規表現のミス
特殊文字のエスケープ忘れ — .、*、+、?、(、)、[、]、{、}、^、$、|、\ はメタ文字です。リテラルのドットにマッチするには \. と書きます。
怠惰が必要なところで貪欲量指定子を使う — <.+> は最初の < から最後の > まですべてにマッチします。個別のタグにマッチするには <.+?> を使います。
JavaScriptで g フラグを忘れる — string.match(/pattern/) は g なしでは最初のマッチしか返しません。すべてのマッチには g を追加します。
複数行テキストで m フラグなしの ^ と $ を使う — m なしでは ^ は文字列全体の始まりにのみマッチし、各行の始まりにはマッチしません。
壊滅的なバックトラッキング — (a+)+ のようなパターンをマッチしない長い文字列に対して使うと指数関数的な時間複雑度を引き起こす可能性があります。重複する文字クラスにネストした量指定子を避けてください。
メール検証の過剰エンジニアリング — 正規のRFC準拠メール正規表現は6,000文字以上あり、それでもすべての無効なメールを防ぐことはできません。形式チェック+確認メールを使用してください。
正規表現をインタラクティブにテスト
ZeroToolの正規表現テスターは分割ペインエディタを提供します。左側でパターンを書き、右側にサンプルテキストを貼り付けます。マッチがリアルタイムでハイライトされ、キャプチャグループが下に表示され、ワンクリックでフラグをトグルできます。
インストール不要。レート制限なし。完全にブラウザで動作します。