TL;DR
- 正規表現テスターを使えば、書いたパターンの動作をリアルタイムで確認できる
- よく使うパターン(メール、電話番号、郵便番号等)はテンプレートとして覚えておくと効率的
- AI正規表現生成ツールを使えば自然言語から正規表現を自動生成できる
正規表現テスターとは
正規表現テスター(Regex Tester)は、正規表現パターンとテスト文字列を入力すると、マッチ結果をリアルタイムでハイライト表示してくれるツールです。
正規表現をコードに組み込む前に動作を確認できるため、以下のメリットがあります。
- 試行錯誤が速い: パターンを変更するたびにコードを実行し直す必要がない
- マッチ結果が視覚的: どの部分がマッチしているかが一目でわかる
- キャプチャグループの確認: グループ化した部分の抽出結果が個別に表示される
-
フラグの切り替え:
g(グローバル)、i(大文字小文字無視)、m(複数行)の効果を即座に確認
基本的な使い方
オンラインの正規表現テスター(regex101やDevToolBox正規表現テスターなど)を開いて、以下の手順で試してみましょう。
Step 1: パターンを入力する
正規表現テスターの「パターン」欄に正規表現を入力します。
パターン: \d{3}-\d{4}-\d{4}
Step 2: テスト文字列を入力する
「テスト文字列」欄に、マッチさせたいテキストを貼り付けます。
テスト文字列:
田中太郎の電話番号は090-1234-5678です。
連絡先: 03-1234-5678
FAX: 06-9876-5432
Step 3: マッチ結果を確認する
マッチした部分がハイライトされます。
マッチ結果:
✅ 090-1234-5678
✅ 03-1234-5678 ← 市外局番もマッチ(意図通りか確認)
✅ 06-9876-5432
この例では市外局番付きの電話番号もマッチしています。携帯電話のみに限定したい場合はパターンを 0[789]0-\d{4}-\d{4} に修正します。
実践パターン集: 日本語開発でよく使う正規表現10選
1. メールアドレス
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
const email = "user@example.com";
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(email);
// => true
注意: RFC 5322完全準拠のメールアドレス正規表現は非常に複雑です。実務ではバリデーションライブラリ(
validator.js等)の使用を推奨します。上記は簡易版です。
2. 日本の電話番号(固定・携帯)
0\d{1,4}-\d{1,4}-\d{4}
// マッチ例
"090-1234-5678" // 携帯
"03-1234-5678" // 東京
"0120-123-456" // フリーダイヤル(4桁にならないので非マッチ)
携帯電話のみ:
0[789]0-\d{4}-\d{4}
3. 郵便番号
\d{3}-\d{4}
"〒100-0001".match(/\d{3}-\d{4}/);
// => ["100-0001"]
4. 日付(YYYY-MM-DD)
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])
"2026-03-24".match(/\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/);
// => ["2026-03-24", "03", "24"] ← キャプチャグループで月・日を個別に取得
5. URLの抽出
https?:\/\/[^\s<>"{}|\\^`\[\]]+
const text = "詳細は https://example.com/path?q=test をご覧ください";
text.match(/https?:\/\/[^\s<>"{}|\\^`\[\]]+/g);
// => ["https://example.com/path?q=test"]
6. HTMLタグの除去
<[^>]+>
"<p>Hello <strong>World</strong></p>".replace(/<[^>]+>/g, '');
// => "Hello World"
注意: 複雑なHTML解析には正規表現ではなくDOMパーサー(
DOMParser、cheerio等)を使ってください。
7. 全角数字の検出
[0-9]+
"料金は1,000円です".match(/[0-9]+/g);
// => ["1", "000"]
全角数字を半角に変換する場合は、前回の記事「全角半角変換と文字コード変換」も参考にしてください。
8. 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
"サーバーIP: 192.168.1.100".match(/\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b/);
// => ["192.168.1.100"]
9. パスワード強度チェック(8文字以上、大小英字+数字+記号)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$/.test("Passw0rd!");
// => true
(?=...) は**先読み(lookahead)**で、実際にはマッチ位置を進めずに条件だけをチェックします。
10. CSVの各フィールドを分割(引用符対応)
実務ではCSVパーサーライブラリ(papaparse等)の使用を推奨しますが、簡易的な分割には以下が使えます。
const csv = 'name,"Tokyo, Japan",30';
// split + 正規表現よりも、matchAllでフィールドを抽出する方が安全
const fields = [...csv.matchAll(/(?:^|,)\s*("(?:[^"]|"")*"|[^,]*)/g)]
.map(m => m[1].replace(/^"|"$/g, '').replace(/""/g, '"'));
console.log(fields);
// => ["name", "Tokyo, Japan", "30"]
引用符内のカンマを区切り文字と誤認しないパターンです。matchAll()を使うとキャプチャグループを個別に取得でき、後処理が簡潔になります。
よくある正規表現の間違いとデバッグ
間違い1: 貪欲マッチ vs 最短マッチ
// 貪欲マッチ(デフォルト): できるだけ長くマッチする
"<div>Hello</div><div>World</div>".match(/<div>.*<\/div>/);
// => ["<div>Hello</div><div>World</div>"] ← 全体にマッチ
// 最短マッチ(?を追加): できるだけ短くマッチする
"<div>Hello</div><div>World</div>".match(/<div>.*?<\/div>/);
// => ["<div>Hello</div>"] ← 最初のdivだけ
*?、+?、?? で最短マッチになります。テスターで両方試して意図通りか確認しましょう。
間違い2: エスケープ忘れ
// NG: .はメタ文字(任意の1文字にマッチ)
"192.168.1.100".match(/192.168.1.100/);
// => ["192.168.1.100"] ← マッチするが "192x168y1z100" にもマッチする
// OK: \.でリテラルのドットに限定
"192.168.1.100".match(/192\.168\.1\.100/);
// => ["192.168.1.100"] ← ドットだけにマッチ
エスケープが必要なメタ文字: . * + ? ^ $ { } [ ] ( ) | \
間違い3: ^と$の複数行での挙動
const text = "line1\nline2\nline3";
// mフラグなし: 文字列全体の先頭/末尾にマッチ
text.match(/^line\d$/);
// => null
// mフラグあり: 各行の先頭/末尾にマッチ
text.match(/^line\d$/gm);
// => ["line1", "line2", "line3"]
間違い4: ReDoS(正規表現によるサービス拒否)
ネストした量指定子は壊滅的バックトラッキングを引き起こし、処理が数秒〜数分フリーズすることがあります。
// NG: (a+)+ のようなネスト量指定子は危険
const evil = /^(a+)+$/;
evil.test("aaaaaaaaaaaaaaaaaaaaaaaaaab");
// => 数秒〜数十秒フリーズする可能性あり
// OK: ネストを排除
const safe = /^a+$/;
safe.test("aaaaaaaaaaaaaaaaaaaaaaaaaab");
// => 即座にfalse
ユーザー入力を正規表現で検証する場合は特に注意が必要です。テスターで長い文字列での動作を確認しましょう。
AI正規表現生成ツールの活用
複雑な正規表現を一から書くのは時間がかかります。自然言語で条件を記述すると正規表現を自動生成してくれるツールが便利です。
例えば「日本の携帯電話番号にマッチする正規表現」と入力すると:
入力: 日本の携帯電話番号(090/080/070で始まるハイフン区切り)
出力: 0[789]0-\d{4}-\d{4}
DevToolBox AI正規表現生成では、自然言語で条件を書くとパターンを自動生成し、テスト文字列でマッチ確認もできます。「メールアドレスかつ.co.jpドメインのみ」のような複合条件も自然言語で指定できるため、正規表現に不慣れな場合に特に有用です。
手動でパターンを調整したい場合はDevToolBox正規表現テスターで編集・テストできます。
JavaScript / Pythonでの正規表現の書き方
JavaScript
// リテラル表記
const pattern = /\d{3}-\d{4}/g;
// RegExpコンストラクタ(動的パターン)
const keyword = "Tokyo";
const dynamic = new RegExp(keyword, "gi");
// よく使うメソッド
"090-1234-5678".match(/\d{3}-\d{4}-\d{4}/); // マッチ結果を返す
/\d+/.test("abc123"); // true/false
"a1b2c3".replace(/\d/g, "X"); // "aXbXcX"
"a,b,,c".split(/,+/); // ["a", "b", "c"]
// matchAll(ES2020+): 全マッチをイテレータで取得(キャプチャグループ付き)
const text = "2026-03-24, 2026-04-01";
for (const m of text.matchAll(/(\d{4})-(\d{2})-(\d{2})/g)) {
console.log(`${m[0]}: 年=${m[1]}, 月=${m[2]}, 日=${m[3]}`);
}
// => "2026-03-24: 年=2026, 月=03, 日=24"
// => "2026-04-01: 年=2026, 月=04, 日=01"
// Unicode property escape(ES2018+): 日本語文字の検出
"Hello世界123".match(/\p{Script=Han}+/gu);
// => ["世界"] ← CJK漢字のみにマッチ
\p{Script=Han}はUnicodeプロパティエスケープで、uフラグ必須です。日本語開発では\p{Script=Hiragana}(ひらがな)、\p{Script=Katakana}(カタカナ)も使えます。
Python
import re
# 基本的な使い方
pattern = r'\d{3}-\d{4}'
result = re.search(pattern, '〒100-0001 東京都')
print(result.group()) # "100-0001"
# 全マッチ
re.findall(r'\d+', 'a1b2c3') # ['1', '2', '3']
# 名前付きキャプチャグループ
m = re.match(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', '2026-03-24')
print(m.group('year')) # "2026"
print(m.group('month')) # "03"
参考リンク
- MDN: Regular expressions
- Python re module
- regex101 — 多言語対応の正規表現テスター(英語UI)
- DevToolBox 正規表現テスター — 日本語UI、クライアントサイド処理
- DevToolBox AI正規表現生成 — 自然言語から正規表現を自動生成
まとめ
正規表現テスターを活用すれば、パターンの動作確認と修正が格段に速くなります。本記事で紹介した10個の実践パターンをテンプレートとして手元に置いておくと、日常の開発で即座に使えます。複雑なパターンはAI正規表現生成ツールで下書きを作り、テスターで微調整するワークフローが効率的です。