正規表現を使っていると「改行を含む文字列を検索したい」「行頭・行末のパターンマッチングがうまくいかない」という問題に直面することがあります。
正規表現における改行の扱いは環境や言語によって動作が異なるため、正しく理解しておくことが重要です。
この記事では、正規表現における改行パターンの記述方法から、行頭・行末の指定・複数行検索の設定まで詳しく解説していきます。
テキスト処理やログ解析などで正規表現を使いこなしたい方にぜひ参考にしていただきたい内容です。
正規表現の改行パターンは\nや\rで表現しフラグ設定によって複数行対応が可能になる
それではまず、正規表現における改行の基本的な表現方法と仕組みについて解説していきます。
正規表現において改行を表す主なパターンは「\n」(ラインフィード・LF)と「\r」(キャリッジリターン・CR)の2種類です。
Unix・Linux・macOSでは改行コードとして「\n」のみを使用しますが、Windowsでは「\r\n」(CRLF)が標準の改行コードとして使われるため、クロスプラットフォームなテキスト処理では両方の改行コードに対応したパターンが必要になります。
正規表現の改行対応で特に重要なのはフラグ(修飾子)の設定です。
デフォルトでは「.(ドット)」は改行文字にマッチしないため、改行を含む複数行のテキストを一括で検索したい場合はSフラグ(singlelineモード)またはDOTALLフラグを有効にする必要があります。
また、「^(行頭)」と「$(行末)」のアンカーはデフォルトでは文字列全体の先頭・末尾にマッチしますが、Mフラグ(multilineモード)を有効にすると各行の先頭・末尾にもマッチするようになります。
改行コードの種類と正規表現での表現
続いては、改行コードの種類と正規表現での表現方法について確認していきます。
主な改行コードとその表現
| 改行コード | 名称 | 正規表現での表現 | 主な使用OS |
|---|---|---|---|
| LF | ラインフィード | \n | Unix・Linux・macOS |
| CR | キャリッジリターン | \r | 旧Mac OS(OS X以前) |
| CRLF | キャリッジリターン+ラインフィード | \r\n | Windows |
全ての改行コードに対応するパターン
クロスプラットフォームなテキスト処理では、全ての改行コードに対応したパターンを使うことが推奨されます。
全改行コードに対応するパターン例
\r?\n :CRLFとLFの両方にマッチ(\rが0回または1回に続いて\n)
\r\n|\r|\n :CRLF・CR・LF全てにマッチ(|で選択肢を列挙)
Pythonでは re.splitや re.subでこのパターンを使うと環境に依存しない改行処理が実現できます。
行頭・行末パターンとフラグの使い方
続いては、行頭・行末を指定するアンカーとフラグの関係について確認していきます。
デフォルトモードとmultilineモードの違い
「^」と「$」の動作はフラグ設定によって大きく変わります。
デフォルト(シングルラインモード)では「^」は文字列全体の先頭のみ、「$」は文字列全体の末尾のみにマッチします。
Mフラグ(multilineモード)を有効にすると「^」は各行の行頭、「$」は各行の行末にもマッチするようになり、複数行テキストの各行に対して処理を適用できます。
言語別のフラグ指定方法
言語別のmultilineフラグ指定例
Python:re.search(r’^pattern’, text, re.MULTILINE) または re.M
JavaScript:/pattern/m (末尾にmフラグ)
PHP:preg_match(‘/pattern/m’, $text)
Java:Pattern.compile(“pattern”, Pattern.MULTILINE)
DOTALLフラグ(Sフラグ)の活用
デフォルトでは「.(ドット)」は改行文字にマッチしませんが、DOTALLフラグ(Pythonではre.DOTALL、JavaScriptではsフラグ)を有効にすることで「.」が改行を含む全ての文字にマッチするようになります。
HTMLタグの内容など、複数行にわたる文字列を一括でマッチさせたい場合にDOTALLフラグが必要です。
複数行テキストの検索パターン実例
続いては、実際の複数行テキスト処理での正規表現パターンの使い方について確認していきます。
行頭・行末の特定パターン検索
複数行テキストでのパターン例
各行の末尾の空白を削除するパターン:\s+$ (multilineフラグが必要)
特定の文字列で始まる行を検索:^ERROR.* (multilineフラグが必要)
HTMLの複数行タグ内容を取得:<div>(.+?)</div> (DOTALLフラグが必要)
改行を含む文字列の置換
改行を含む文字列を置換する際は、検索パターンに改行エスケープシーケンスを含め、置換文字列でも改行を正しく指定することが重要です。
連続する空行を1行に圧縮するパターンとして「\n{2,}」→「\n」という置換が代表的な活用例です。
| フラグ | 効果 | Python | JavaScript |
|---|---|---|---|
| multiline(m) | ^・$が各行頭末にマッチ | re.MULTILINE / re.M | /pattern/m |
| DOTALL(s) | 「.」が改行にもマッチ | re.DOTALL / re.S | /pattern/s |
| IGNORECASE(i) | 大文字小文字を区別しない | re.IGNORECASE / re.I | /pattern/i |
まとめ
正規表現の改行パターンは\n(LF)・\r(CR)・\r\n(CRLF)の3種類があり、クロスプラットフォームな処理には\r?\nまたは\r\n|\r|\nパターンが有効です。
行頭・行末の^・$アンカーはmultilineフラグを有効にすることで各行に適用でき、「.」は DOTALLフラグで改行も含めてマッチさせることができます。
使用する言語でのフラグ指定方法を把握しておくことで、改行を含む複雑なテキスト処理も正確に実装できるでしょう。
正規表現チェッカーで改行パターンを実際に試しながら、理解を深めていただければと思います。