正規表現(Regular Expression、略してregex)は、テキストのパターンマッチングと操作のための強力なツールだ。プログラミング、データ処理、テキストエディタでの検索置換など、あらゆる場面で活躍する。
一見すると暗号のように見える正規表現だが、基本的な構文を理解すれば、複雑なテキスト処理も簡潔に記述できるようになる。
本記事では、正規表現の基本構文から実践的なパターンまでを体系的に解説する。
ツールで試しながら学ぶ L-yard Tools の正規表現テスターを使えば、リアルタイムでパターンをテストできる。本記事のサンプルをコピーして試してみよう。
基本構文
リテラル文字
最もシンプルな正規表現は、マッチさせたい文字そのものだ。
パターン: hello
マッチ: "hello world" の "hello"
大文字小文字は区別される。Helloとhelloは別のパターンとして扱われる(フラグで変更可能)。
メタ文字
正規表現には特別な意味を持つメタ文字がある。
| メタ文字 | 意味 | 例 |
|---|---|---|
. | 任意の1文字 | a.c → abc, aXc |
^ | 行の先頭 | ^Hello → 行頭のHello |
$ | 行の末尾 | end$ → 行末のend |
* | 0回以上の繰り返し | ab*c → ac, abc, abbc |
+ | 1回以上の繰り返し | ab+c → abc, abbc |
? | 0回または1回 | colou?r → color, colour |
\ | エスケープ | \. → ピリオド自体 |
| ` | ` | OR(または) |
() | グループ化 | (ab)+ → ab, abab |
[] | 文字クラス | [aeiou] → 母音 |
{} | 繰り返し回数 | a{2,4} → aa, aaa, aaaa |
メタ文字のエスケープ
メタ文字自体をマッチさせたい場合は、バックスラッシュでエスケープする。
パターン: \$100\.00
マッチ: "$100.00"
文字クラス
基本的な文字クラス
角括弧[]で囲んだ文字のいずれかにマッチする。
パターン: [aeiou]
マッチ: 任意の母音1文字
パターン: [0-9]
マッチ: 任意の数字1文字
範囲指定
ハイフンで範囲を指定できる。
| パターン | 意味 |
|---|---|
[a-z] | 小文字アルファベット |
[A-Z] | 大文字アルファベット |
[a-zA-Z] | すべてのアルファベット |
[0-9] | 数字 |
[a-zA-Z0-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] | 空白以外 |
量指定子
基本的な量指定子
| 量指定子 | 意味 | 例 |
|---|---|---|
* | 0回以上 | a* → "", a, aa, aaa… |
+ | 1回以上 | a+ → a, aa, aaa… |
? | 0回または1回 | a? → "", a |
{n} | ちょうどn回 | a{3} → aaa |
{n,} | n回以上 | a{2,} → aa, aaa, aaaa… |
{n,m} | n回以上m回以下 | a{2,4} → aa, aaa, aaaa |
貪欲と非貪欲
デフォルトでは、量指定子は**貪欲(greedy)**に動作する。つまり、可能な限り長くマッチしようとする。
テキスト: <div>内容</div>
パターン: <.*>
マッチ: "<div>内容</div>" (全体)
?を付けると**非貪欲(lazy)**になり、最短マッチになる。
テキスト: <div>内容</div>
パターン: <.*?>
マッチ: "<div>" (最短)
アンカー
アンカーは位置を指定する。文字自体にはマッチしない。
| アンカー | 意味 |
|---|---|
^ | 行の先頭 |
$ | 行の末尾 |
\b | 単語の境界 |
\B | 単語境界以外 |
単語境界の例
テキスト: "cat category"
パターン: \bcat\b
マッチ: "cat" のみ(categoryのcatは除外)
グループ化とキャプチャ
基本的なグループ
括弧()でパターンをグループ化できる。
パターン: (ab)+
マッチ: ab, abab, ababab...
キャプチャグループ
グループはキャプチャされ、後から参照できる。
パターン: (\d{4})-(\d{2})-(\d{2})
テキスト: 2026-01-31
グループ1: 2026
グループ2: 01
グループ3: 31
後方参照
キャプチャした内容を同じパターン内で参照できる。
パターン: (\w+)\s+\1
マッチ: "the the"(同じ単語の繰り返し)
非キャプチャグループ
キャプチャ不要な場合は(?:)を使う。
パターン: (?:ab)+c
マッチ: abc, ababc...(グループ化するがキャプチャしない)
先読み・後読み
肯定先読み
(?=pattern) - patternが後に続く位置にマッチ。
パターン: \d+(?=円)
テキスト: "100円、200ドル"
マッチ: "100"(円が続く数字のみ)
否定先読み
(?!pattern) - patternが後に続かない位置にマッチ。
パターン: \d+(?!円)
テキスト: "100円、200ドル"
マッチ: "200"(円が続かない数字)
肯定後読み
(?<=pattern) - patternが前にある位置にマッチ。
パターン: (?<=\$)\d+
テキスト: "$100、200円"
マッチ: "100"($が前にある数字)
否定後読み
(?<!pattern) - patternが前にない位置にマッチ。
パターン: (?<!\$)\d+
テキスト: "$100、200円"
マッチ: "200"
実践パターン集
メールアドレス
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
| 部分 | 説明 |
|---|---|
^[a-zA-Z0-9._%+-]+ | ローカルパート(@の前) |
@ | @記号 |
[a-zA-Z0-9.-]+ | ドメイン名 |
\.[a-zA-Z]{2,}$ | TLD(.com, .jpなど) |
電話番号(日本)
0\d{1,4}-\d{1,4}-\d{4}
マッチ例: 03-1234-5678, 090-1234-5678
ハイフンなしも許容する場合:
0\d{9,10}
URL
https?://[\w\-._~:/?#\[\]@!$&'()*+,;=%]+
日付(YYYY-MM-DD)
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])
郵便番号(日本)
\d{3}-\d{4}
IPアドレス(IPv4)
\b(?:\d{1,3}\.){3}\d{1,3}\b
より厳密なバージョン(0-255の範囲チェック):
\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b
フラグ(修飾子)
正規表現の動作を変更するフラグがある。
| フラグ | 意味 |
|---|---|
i | 大文字小文字を区別しない |
g | グローバル(全てのマッチを検索) |
m | 複数行モード(^と$が行頭・行末に) |
s | .が改行にもマッチ |
JavaScriptでの使用例:
const regex = /hello/gi; // 大文字小文字無視、グローバル
よくある落とし穴
1. 貪欲マッチに注意
// 期待と違う結果
テキスト: <b>太字</b>と<b>強調</b>
パターン: <b>.*</b>
結果: "<b>太字</b>と<b>強調</b>" (全体)
// 正しくは非貪欲を使う
パターン: <b>.*?</b>
結果: "<b>太字</b>", "<b>強調</b>" (個別)
2. 特殊文字のエスケープ忘れ
ピリオド、ドル記号、括弧などはエスケープが必要。
// 間違い
パターン: $100.00
マッチ: 意図しない結果
// 正しい
パターン: \$100\.00
マッチ: "$100.00"
3. 文字クラス内の特殊文字
文字クラス内ではほとんどの特殊文字がリテラルとして扱われる。ただし], \, ^, -は注意。
パターン: [.+*?] // OK(エスケープ不要)
パターン: [\]] // ]はエスケープ必要
パターン: [a\-z] // -はエスケープ必要(範囲と区別)
パフォーマンスのヒント
1. アンカーを活用
^や$を使うと、検索範囲が限定されて高速化する。
2. 非キャプチャグループを使う
キャプチャが不要なら(?:)を使う。
3. 過度なバックトラックを避ける
(a+)+のようなネストした量指定子は、指数的なバックトラックを引き起こす可能性がある。
// 危険なパターン
(a+)+$
// 改善版
a+$
まとめ
正規表現は習得に時間がかかるが、一度身につければテキスト処理の効率が劇的に向上する。
学習のコツ:
- 基本構文を覚える(メタ文字、量指定子、文字クラス)
- 実際にテスターで試す
- 実務で使うパターンから始める
- 徐々に高度な機能(先読み、後読みなど)を学ぶ
L-yard Tools の正規表現テスターを活用して、実践的にスキルを磨いていこう。
参考リンク
- L-yard 正規表現テスター
- MDN - 正規表現
- regex101 - オンラインテスター(詳細解説付き)