Toolypet
Back to Blog
Dev

正規表現チートシート:よく使うパターン集

ウェブ開発で最もよく使用する正規表現パターンと活用例をまとめました。

Toolypet Team4 min read
正規表現チートシート:よく使うパターン集

正規表現、なぜ学ぶべき?

正規表現(Regular Expression、Regex)は開発者にとってスイスアーミーナイフのような存在です。最初は難しく感じますが、一度慣れれば何十行もの文字列処理コードをたった1行で置き換えることができます。メール検証、電話番号の抽出、ログのパース、テキスト置換など、文字列を扱うほぼすべての作業で正規表現は輝きを放ちます。

多くの開発者が正規表現を恐れる理由は、その構文が一目で理解できないからです。/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ のようなコードは、まるで暗号文のように見えます。しかし、基本構文さえ理解すれば、このパターンも論理的に読めるようになります。この記事では、正規表現の核心構文を先に説明し、実務でよく使用するパターンを一つずつ分解して見ていきます。

基本構文を体系的に理解する

正規表現の構文は大きく4つのカテゴリに分けられます:メタ文字、量指定子、グループ、アンカーです。

メタ文字:特別な意味を持つ文字

メタ文字は特定の文字集合や条件を表します。

記号意味
.改行を除くすべての文字a.c → abc, adc, a1c
\d数字 (0-9)\d+ → 123, 4567
\D数字でない文字\D+ → abc, !@#
\w単語文字 (a-z, A-Z, 0-9, _)\w+ → hello_123
\W単語文字でないもの\W → 空白、特殊文字
\s空白文字 (スペース、タブ、改行)\s+ → 複数の空白
\S空白でない文字\S+ → 連続した単語

量指定子:繰り返しを表現する

量指定子は前の要素が何回繰り返されるかを指定します。

記号意味
*0個以上ab* → a, ab, abb, abbb
+1個以上ab+ → ab, abb, abbb
?0個または1個colou?r → color, colour
{n}ちょうどn個\d{4} → 2025
{n,}n個以上\d{2,} → 10, 100, 1000
{n,m}n個以上m個以下\d{2,4} → 10, 100, 1000

アンカーと境界

アンカーは文字自体ではなく位置をマッチングします。

記号意味
^文字列の先頭^Hello → "Hello World"にマッチ
$文字列の末尾World$ → "Hello World"にマッチ
\b単語境界\bcat\b → "cat"のみ、"catch"は不可
\B単語境界でない場所\Bcat → "catch"のcat

グループとキャプチャ

括弧を使用するとパターンをグループ化し、マッチした部分をキャプチャできます。

const dateStr = '2025-12-25';
const regex = /(\d{4})-(\d{2})-(\d{2})/;

const match = dateStr.match(regex);
console.log(match[0]); // '2025-12-25' (全体マッチ)
console.log(match[1]); // '2025' (最初のグループ - 年)
console.log(match[2]); // '12'   (2番目のグループ - 月)
console.log(match[3]); // '25'   (3番目のグループ - 日)

実践パターン集:一つずつ分解する

1. メール検証

メールパターンは正規表現の古典的な例です。段階的に分解してみましょう。

const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;

パターン分解:

  • ^ - 文字列の先頭
  • [a-zA-Z0-9._%+-]+ - ローカルパート (@の前の部分):アルファベット、数字、ドット、アンダースコアなどが1個以上
  • @ - @記号 (リテラル)
  • [a-zA-Z0-9.-]+ - ドメイン名:アルファベット、数字、ドット、ハイフンが1個以上
  • \. - ドット (エスケープ必要)
  • [a-zA-Z]{2,} - トップレベルドメイン:アルファベット2文字以上 (com, jp, museumなど)
  • $ - 文字列の末尾

エッジケースの処理: このパターンはほとんどの一般的なメールを検証しますが、RFC 5322標準を完全には遵守していません。例えば "user name"@example.com のようなクォートを含むメールはマッチしません。実務では形式検証後に実際のメール送信で確認するのが最も確実です。

2. パスワード強度チェック

複雑なパスワードルールを正規表現で検証するには、先読み(Lookahead)を使用します。

// 最低8文字、大文字・小文字、数字、特殊文字を含む
const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;

パターン分解:

  • (?=.*[a-z]) - 小文字が最低1個含まれること (先読み)
  • (?=.*[A-Z]) - 大文字が最低1個含まれること
  • (?=.*\d) - 数字が最低1個含まれること
  • (?=.*[@$!%*?&]) - 特殊文字が最低1個含まれること
  • [A-Za-z\d@$!%*?&]{8,} - 許可された文字で8文字以上

先読み (?=...) は、そのパターンが存在するか確認しますが、実際に文字を消費しません。これにより複数の条件を同時にチェックできます。

3. 電話番号検証

日本の携帯電話番号を検証するパターンです。

const phoneRegex = /^0[789]0-?\d{4}-?\d{4}$/;

パターン分解:

  • 0[789]0 - 070, 080, 090で始まる
  • -? - ハイフンはあってもなくてもOK
  • \d{4} - 4桁の数字
  • \d{4} - 最後の4桁
phoneRegex.test('090-1234-5678');  // true
phoneRegex.test('09012345678');    // true
phoneRegex.test('090 1234 5678');  // false (空白は未対応)

4. URL検証

URLパターンは様々な形式をサポートする必要があるため複雑になります。

const urlRegex = /^(https?:\/\/)?(www\.)?[\w-]+(\.[a-z]{2,})+([\/\w.-]*)*\/?$/i;

パターン分解:

  • (https?:\/\/)? - プロトコル (http:// または https://) オプション
  • (www\.)? - www. オプション
  • [\w-]+ - ドメイン名
  • (\.[a-z]{2,})+ - .com, .co.jp などトップレベルドメイン (1個以上)
  • ([\/\w.-]*)* - パス (オプション)
  • \/?$ - 最後のスラッシュ オプション
  • i フラグ - 大文字小文字を無視

5. IPv4アドレス検証

IPv4アドレスの各オクテットは0-255の範囲でなければなりません。これを正規表現で表現すると:

const ipv4Regex = /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/;

パターン分解 (0-255マッチング):

  • 25[0-5] - 250-255
  • 2[0-4]\d - 200-249
  • [01]?\d\d? - 0-199
ipv4Regex.test('192.168.1.1');     // true
ipv4Regex.test('256.1.1.1');       // false (256は範囲外)
ipv4Regex.test('192.168.001.001'); // true (先頭の0を許可)

パフォーマンス最適化

正規表現が遅くなる最大の原因はバックトラッキング(Backtracking)です。貪欲な量指定子が過度に使用されると、パフォーマンスが急激に低下する可能性があります。

貪欲 vs 怠惰な量指定子

// 貪欲 (Greedy) - できるだけ多くマッチ
'<div>content</div><div>more</div>'.match(/<div>.*<\/div>/);
// 結果: '<div>content</div><div>more</div>' (全体)

// 怠惰 (Lazy) - 最小限だけマッチ
'<div>content</div><div>more</div>'.match(/<div>.*?<\/div>/);
// 結果: '<div>content</div>' (最初のものだけ)

量指定子の後に ? をつけると怠惰なマッチングになります: *?, +?, ??

最適化のヒント

  1. アンカーを使用: ^$ で範囲を明確に制限
  2. 具体的な文字クラスを使用: .* の代わりに [^<]* のように制限
  3. 非キャプチャグループを使用: キャプチャが不要なら (?:...) を使用
// キャプチャグループ - 遅い (マッチ結果を保存)
/(abc)+/

// 非キャプチャグループ - 速い (保存しない)
/(?:abc)+/

JavaScriptでの正規表現活用

const str = 'Contact us at support@example.com or sales@example.com';
const regex = /[\w.-]+@[\w.-]+\.\w+/g;

// すべてのマッチを見つける
const emails = str.match(regex);
// ['support@example.com', 'sales@example.com']

// 置換
const masked = str.replace(regex, '[メール非表示]');
// 'Contact us at [メール非表示] or [メール非表示]'

// 分割
'a,b;c:d'.split(/[,;:]/);
// ['a', 'b', 'c', 'd']

// 繰り返しマッチング (matchAll)
for (const match of str.matchAll(/(\w+)@(\w+\.\w+)/g)) {
  console.log(`ローカル: ${match[1]}, ドメイン: ${match[2]}`);
}

Toolypet Regex Testerの活用

正規表現を書く時に最も難しい点は、即座にフィードバックを得にくいことです。ToolypetのRegex Testerはこの問題を解決します:

  • パターンとテスト文字列を入力するとリアルタイムでマッチング結果を確認
  • 各キャプチャグループが何をマッチしたか視覚的に表示
  • 複数のフラグ(g, i, m)をトグルで簡単にテスト
  • よく使用するパターンテンプレートを提供

複雑な正規表現をデバッグする時、コードで直接テストするよりToolypetで先に検証する方がはるかに効率的です。

RegexRegular ExpressionValidationPattern Matching