正規表現チートシート:究極リファレンス
正規表現(Regex)は非常に強力ですが、習得が難しいことでも知られています。メールアドレスのバリデーション、データのスクレイピング、あるいはコード内の検索など、信頼できる正規表現チートシートがあれば、作業時間を大幅に短縮できます。
このガイドでは、基本文字から複雑な前方・後方参照まで、すべての正規表現コンポーネントを視覚的な解説と実例付きで解説します。
1. 主要なメタ文字
これらはあらゆる正規表現パターンの基本要素です。
| メタ文字 | 説明 | 例 |
|---|---|---|
. |
改行を除く任意の 1 文字に一致 | a.b は acb, a1b に一致 |
\ |
特殊文字をエスケープ | \. はリテラルとしての . に一致 |
| |
選択 (OR) | cat|dog は cat または dog に一致 |
[] |
文字セット(括弧内の任意の文字) | [aeiou] は任意の母音に一致 |
[^] |
否定文字セット | [^0-9] は数字以外の任意の文字に一致 |
2. 量詞:出現回数の制御
量詞は、文字やグループが何回出現すべきかを指定します。
| 量詞 | 説明 | 例 |
|---|---|---|
* |
0 回以上 | a* は ``, a, aa に一致 |
+ |
1 回以上 | a+ は a, aa に一致 |
? |
0 回または 1 回 (オプション) | a? は `` または a に一致 |
{n} |
ちょうど n 回 |
a{3} は aaa に一致 |
{n,} |
n 回以上 |
a{2,} は aa, aaa に一致 |
{n,m} |
n 回から m 回の間 |
a{2,4} は aa, aaa, aaaa に一致 |
3. 文字クラス:一般的なショートカット
| クラス | 説明 | 同等表現 |
|---|---|---|
\d |
任意の数字 | [0-9] |
\D |
数字以外の任意の文字 | [^0-9] |
\w |
任意の英単語文字(英数字 + _) |
[a-zA-Z0-9_] |
\W |
英単語文字以外の任意の文字 | [^a-zA-Z0-9_] |
\s |
任意の空白文字(スペース、タブ、改行) | [ \t\n\r\f\v] |
\S |
空白文字以外の任意の文字 | [^ \t\n\r\f\v] |
4. アンカー:境界の定義
| アンカー | 説明 | 例 |
|---|---|---|
^ |
文字列/行の先頭 | ^Hello |
$ |
文字列/行の末尾 | World$ |
\b |
単語の境界 | \bcat\b ("cat" には一致するが "category" には一致しない) |
\B |
単語の境界以外 | \Bcat ("category" 内の "cat" に一致) |
5. グループとキャプチャ
| 構文 | 説明 | 例 |
|---|---|---|
(...) |
キャプチャグループ | (abc)+ は abcabc に一致 |
(?:...) |
非キャプチャグループ | (?:abc)+ |
(?<name>...) |
名前付きキャプチャグループ | (?<id>\d+) |
\1 |
グループ1への後方参照 | (\w)\1 は aa, bb に一致 |
6. 前方・後方参照 (Lookaround):高度なフィルタリング
Lookaround を使用すると、特定のパターンの前後に別のパターンが存在する(または存在しない)場合にのみ一致させることができます。Lookaround 部分は一致結果には含まれません。
| 構文 | 名称 | 説明 |
|---|---|---|
(?=...) |
肯定先読み (Positive Lookahead) | 後ろに ... が続く |
(?!...) |
否定先読み (Negative Lookahead) | 後ろに ... が続かない |
(?<=...) |
肯定戻り読み (Positive Lookbehind) | 前に ... がある |
(?<!...) |
否定戻り読み (Negative Lookbehind) | 前に ... がない |
7. 鉄道図 (Railroad Diagrams) による正規表現の可視化
複雑な正規表現パターンは、すぐに判読不能になることがあります。鉄道図は、正規表現の流れを視覚的に表現する方法です。
線路を想像してください:
- 線路は選択 (
|) で分岐します。 - 線路は量詞 (
*,+) でループします。 - 線路はグループのボックスを通過します。
可視化ツールを使用すると、ネストされたグループや複雑な量詞を扱う際のロジックエラーをデバッグするのに役立ちます。
8. 実践的な例
メールアドレスのバリデーション(簡略版)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
強力なパスワード(Lookahead の例)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$
(小文字、大文字、数字をそれぞれ 1 つ以上含み、8 文字以上)
電話番号(米国形式)
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$
9. よくある質問 (FAQ)
Q: 「強欲 (Greedy)」と「無欲 (Lazy)」な一致の違いは何ですか?
A: デフォルトでは、量詞は強欲であり、可能な限り長い文字列に一致しようとします。量詞の後に ? を付ける(例: .*?)と、無欲(または非強欲)になり、可能な限り短い文字列に一致します。
Q: 大文字と小文字を区別せずに検索するにはどうすればよいですか?
A: 多くの正規表現エンジンでは、フラグ(通常は i)を使用して大文字小文字の区別を無効にします。例えば、/hello/i は Hello, HELLO, hello すべてに一致します。
Q: バックトラッキングとは何ですか?なぜ重要なのですか?
A: 正規表現エンジンがあるパスを試して失敗し、別のパスを試すために「戻る」ときにバックトラッキングが発生します。ネストされた量詞を持つ複雑なパターンは、壊滅的なバックトラッキングを引き起こし、アプリケーションやサーバーがフリーズする原因になることがあります。
Tool3M でパターンをテストする
- 正規表現テスター: ハイライトと視覚的デバッグ機能を備えたリアルタイム正規表現テスト。
- JSON フォーマッター: 正規表現を使用して大規模な JSON データセットを検索・フィルタリング。
- ケースコンバーター: 正規表現フィルターを適用する前にテキストをクリーンアップ。