正規表現 実務リファレンス完全版(多言語・複数行対応)

概要(What)

この記事は、実践的かつ移植性の高い正規表現の使用方法についての完全な技術リファレンスです。構文、複数行のパターン処理、置換テクニック、ツール互換性、保守可能なパターン設計に関する内容を含みます。

目的(Why)

正規表現は、バリデーション、解析、変換、データ抽出といったテキスト処理の基礎です。すべてのプログラミング言語やプラットフォームで使用され、正しく使いこなすことで、効率的な自動化やデータ整備、分析が可能になります。


Part 1: 基本文法

パターン 意味 マッチ例
. 改行を除く任意の1文字 a.c abc, a-c
* 直前の文字の0回以上の繰り返し go*gle ggle, google
+ 直前の文字の1回以上の繰り返し go+gle gogle, google
? 直前の文字が0回または1回 colou?r color, colour
{n} ちょうどn回の繰り返し a{3} aaa
{n,m} n回以上m回以下の繰り返し a{2,4} aa, aaa, aaaa
^ 行の先頭 ^abc 行頭がabcの行
$ 行の末尾 abc$ 行末がabcの行
[] いずれか1文字 [abc] a, b, c
[^] 指定された文字以外 [^0-9] 数字以外
\d 数字 \d+ 123, 007
\D 数字以外 \D+ abc, XYZ
\w 単語文字(英数字とアンダースコア) \w+ abc_123
\W 非単語文字 \W+ #@!, 空白など
\s 空白文字 \s+ 空白、改行、タブ等
\S 空白でない文字 \S+ abc, 123
` ` OR条件 `foo
() グルーピング (abc)+ abcabc
\b 単語の境界 \bregex\b 単語そのもののみ

Part 2: 実用パターン(多言語対応)

用途 パターン 備考
数字のみ ^\d+$ 全体が数字である
小数点付き数値 ^\d+\.\d+$ 小数点1つを許容
英数字のみ ^[a-zA-Z0-9]+$ ユーザーIDなどに有用
メール(簡易) ^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$ 一般的な形式
URL(http/https) https?://[\w.-]+\.[a-zA-Z]{2,}(/[\w./?=&%-]*)? パス・クエリも含め対応
ISO形式の日付 \d{4}-\d{2}-\d{2} YYYY-MM-DD
国際電話番号 \+\d{1,3}[\s-]?\d{1,14} 例:+81 90...
ユーザー名 ^[a-zA-Z0-9._-]{3,20}$ SNSなどのユーザー名形式
パスワード強度(簡易) ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$ 大文字・小文字・数字を含む

Part 3: 複数行マッチング(Multi-Line)

🔹 なぜ [\s\S]*? を使うのか?

多くのツールや言語では、.(ドット)が改行文字にマッチしないため、複数行ブロックを取得できない。
その代替として推奨されるのが:

[\s\S]*?

これは改行を含むすべての文字に非貪欲でマッチする。

💡 補足:一部ツール(例:VSCodeなど)では [\s\S\n]*? も利用可能。これは冗長ではあるが、一部の実装に対する安全策として有効な場合がある。

🔹 よく使うパターン

用途 パターン 備考
任意のテキストブロック [\s\S]*? 改行を含む安全な一致方法
HTMLのdivブロック <div[\s\S]*?</div> 閉じタグまでのdiv全体を取得
コメントブロック <!--[\s\S]*?--> HTMLコメント
Markdownコード "[\s\S]*?" バックティックコードブロック

Part 4: 置換テクニック(Replacement Techniques)

🔹 グループ置換の構文

多くのツールで以下のようなキャプチャグループの参照が可能:

  • ${1}, ${2}(VSCode, .NET, Pythonなど)
  • $1, $2(JavaScript, sedなど)

🔹 実用的な例

タスク パターン 置換結果
単語の順序を逆に (\w+)\s+(\w+) ${2} ${1}
テキストをspanで囲む >([^<]+)< ><span>${1}</span><
CSVをJSONに変換 ^([^,]+),([^,]+),([^,]+)$ { "a": "${1}", "b": "${2}", "c": "${3}" }
日付フォーマット変換 (\d{4})/(\d{2})/(\d{2}) ${1}-${2}-${3}
キャメルをスネークに ([a-z])([A-Z]) ${1}_${2}

Part 5: ツール別の対応状況とフラグ

ツール 複数行対応 非貪欲マッチ 置換構文 備考
VSCode ✅(検索パネル) ${1} [\s\S]*? または [\s\S\n]*? が推奨
JavaScript ✅(sフラグ) $1, $<name> 名前付きグループ使用可能
Python (re) ✅(DOTALL指定) \g<1> または \1 生文字列(r"")推奨
sed ❌(1行単位) \1, \2 基本文法のみ対応
grep/egrep ❌(置換不可) 検索専用。置換は不可

Part 6: 設計指針とアンチパターン(Design Best Practices)

✅ 推奨ルール

  • 改行対応には常に [\s\S]*? を使用(必要なら [\s\S\n]*?
  • .* の多用を避け、最短一致(非貪欲)を基本にする
  • キャプチャ不要な括弧は (?:...) で書く
  • 可読性向上のため名前付きグループを活用(例:(?<year>\d{4})
  • 複雑な正規表現にはコメントまたは re.VERBOSE を活用

❌ アンチパターン

パターン 問題点
.* 最長一致により意図外までマッチする可能性が高い
[^a-z] アクセント付き文字や多言語に対応できない
ネスト解析 HTML/XMLなどのネスト構造は正規表現に不向き
.+ 空白だけの行にもマッチする恐れがある

結論(Conclusion)

このガイドは、さまざまな環境で正規表現を安全かつ効率的に活用するための完全リファレンスです。
マルチライン対応では [\s\S]*?(または必要に応じて [\s\S\n]*?)を標準とし、ツール固有の構文にも注意を払いながら、読みやすく保守可能なパターン設計を行いましょう。

しっかり設計された正規表現は、強力かつ再利用可能なツールになります。

タイトルとURLをコピーしました