はじめに - Perlと正規表現の密接な関係
Perlと正規表現は切っても切れない関係にあります。Larry Wallが1987年にPerlを作った理由の一つが、強力なテキスト処理能力でした。正規表現はPerlの「第一級市民」として言語仕様に組み込まれており、他の言語では関数呼び出しが必要な処理も、Perlでは演算子として直接記述できます。
実際、多くのプログラミング言語の正規表現エンジンは「PCRE(Perl Compatible Regular Expressions)」と呼ばれ、Perl互換を謳っています。つまり、Perlの正規表現がデファクトスタンダードになっているのです。
この記事では、Perlの正規表現を基礎から応用まで体系的に解説します。
正規表現の基本演算子
Perlには正規表現のための専用演算子が用意されています。
マッチング演算子(m//)
|
|
置換演算子(s///)
|
|
文字変換演算子(tr///またはy///)
|
|
メタ文字とキャラクタークラス
基本的なメタ文字
|
|
キャラクタークラス
|
|
キャプチャと後方参照
基本的なキャプチャ
|
|
後方参照
|
|
名前付きキャプチャ(Perl 5.10+)
|
|
修飾子の活用
よく使う修飾子
|
|
r修飾子による非破壊的操作
|
|
先読み・後読み(Lookaround)
肯定先読み(Positive Lookahead)
|
|
否定先読み(Negative Lookahead)
|
|
肯定後読み(Positive Lookbehind)
|
|
否定後読み(Negative Lookbehind)
|
|
/x修飾子を使った読みやすい正規表現
複雑な正規表現は読みにくくなりがちです。/x修飾子を使うと、空白やコメントを含めることができます。
|
|
実用的なパターン集
メールアドレスのバリデーション
|
|
URLの抽出と解析
|
|
日付のパース
|
|
ログファイルの解析
|
|
Perl独自の高度な機能
コード実行((?{ code }))
|
|
条件分岐((?(condition)yes-pattern|no-pattern))
|
|
再帰的パターン((?R))
|
|
正規表現のデバッグ
use re ‘debug’を使ったデバッグ
|
|
use re ‘debugcolor’でカラー出力
|
|
Regexp::Debuggerモジュールの使用
|
|
パフォーマンスのTips
不要なキャプチャを避ける(非キャプチャグループ)
|
|
アンカーを活用する
|
|
貪欲vs非貪欲マッチの選択
|
|
qr//でパターンをプリコンパイル
|
|
よくある間違いと落とし穴
1. 貪欲マッチによる予期しない結果
|
|
2. . が改行にマッチしない
|
|
3. キャプチャ変数のスコープ
|
|
4. /gフラグの状態管理
|
|
5. メタ文字のエスケープ忘れ
|
|
まとめ
Perlの正規表現は非常に強力で、テキスト処理の多くの場面で活躍します。この記事で紹介した内容をマスターすれば、以下のことができるようになります:
- 基本的なパターンマッチングと置換
- 複雑なパターンの構築と理解
- キャプチャと名前付きキャプチャの活用
- 先読み・後読みを使った高度なマッチング
- /x修飾子による保守しやすい正規表現の作成
- 実用的なパターン(メール、URL、日付など)の実装
- Perl独自の高度な機能の活用
- パフォーマンスを考慮した最適化
- よくある間違いの回避
正規表現は最初は難しく感じるかもしれませんが、練習を重ねることで強力な武器になります。小さなパターンから始めて、徐々に複雑なものに挑戦していきましょう。
Perlの正規表現の世界は深淵です。この記事が、その世界への入り口となれば幸いです。Happy Pattern Matching!
参考資料
- perlre: Perl正規表現の公式ドキュメント
- perlretut: Perl正規表現チュートリアル
- perlrequick: Perl正規表現クイックスタート
- Regexp::Debugger: 正規表現デバッガー
- YAPE::Regex::Explain: 正規表現を人間が読める形式に変換