詳説 正規表現 第3版
オライリー・ジャパン
著者:Jeffrey E.F.Friedl
訳者:株式会社ロングテール、長尾高弘
はじめに
1章 正規表現入門
1.1 現実の問題を解決するために
1.2 言語としての正規表現
1.2.1 ファイル名との類似点
1.2.2 言語との類似点
1.3 正規表現という思考の枠組み
1.3.1 ある程度正規表現のことを知っているなら
1.3.2 ファイルからのテキストの検索:egrep
1.4 egrepのメタ文字
1.4.1 行頭と行末
1.4.2 文字クラス
1.4.3 任意の文字にマッチするドット
1.4.4 選択
1.4.5 大文字と小文字の違いを無視する
1.4.6 単語の境界
1.4.7 これまでのまとめ
1.4.8 量指定子:オプション
1.4.9 その他の量指定子:繰り返し
1.4.10 括弧と後方参照
1.4.11 大脱走――偉大なるエスケープ
1.5 基礎を発展させる
1.5.1 言語の多様性
1.5.2 正規表現の目的
1.5.3 実例をもっと
1.5.4 正規表現の用語
1.5.5 現状の打破
1.5.6 まとめ
1.6 章の終わりに一言
2章 初心者向けのサンプル
2.1 サンプルについて
2.1.1 Perlの簡単な解説
2.2 正規表現をテキストにマッチさせる
2.2.1 もっと本格的に
2.2.2 マッチが成功したときの副作用
2.2.3 入り組んだ正規表現
2.2.4 中締め
2.3 正規表現によるテキストの書き換え
2.3.1 サンプル:ダイレクトメール
2.3.2 サンプル:株価表示の整形
2.3.3 自動編集
2.3.4 ささやかなメールユーティリティ
2.3.5 先後読みによって数値にカンマを付け加える
2.3.6 テキストからHTMLへの変換
2.3.7 語の重複問題再説
3章 正規表現の機能と方言
3.1 正規表現のスケッチ
3.1.1 正規表現の起源
3.1.2 一見してわかる違い
3.2 正規表現処理のインタフェース
3.2.1 統合型インタフェース
3.2.2 手続き型、オブジェクト指向型インタフェース
3.2.3 置換のサンプル
3.2.4 その他の言語による置換
3.2.5 インタフェースのまとめ
3.3 文字列、コード体系、モード
3.3.1 正規表現を表す文字列
3.3.2 コード体系の問題
3.3.3 Unicode
3.3.4 正規表現モードとマッチモード
3.4 よく使われるメタ文字とその機能
3.4.1 文字の表現
3.4.2 文字クラスと文字クラス的な構文
3.4.3 アンカーなどの“ゼロ幅マッチ”
3.4.4 コメントとモード修飾子
3.4.5 グループ化、キャプチャ、条件分岐、制御構造
3.5 高度な内容を扱う章に進むための指針
4章 正規表現処理のメカニズム
4.1 エンジン始動
4.1.1 2種類のエンジン
4.1.2 新基準
4.1.3 正規表現エンジンのタイプ
4.1.4 合衆国冗長省からの要請
4.1.5 エンジンのタイプのテスト
4.2 マッチの基本原則
4.2.1 サンプルについて
4.2.2 原則1:最初にマッチしたものが優先される
4.2.3 エンジンの部品
4.2.4 原則2:標準の量指定子は欲張りである
4.3 正規表現主導かテキスト主導か
4.3.1 正規表現主導型のNFAエンジン
4.3.2 テキスト主導型のDFAエンジン
4.3.3 NFAとDFAの比較:最初の考察
4.4 バックトラック
4.4.1 パン切れのたとえ
4.4.2 バックトラックに関する2つの重要なポイント
4.4.3 保存ステート
4.4.4 バックトラックと欲張り度
4.5 さらに、欲張りなこととバックトラックについて
4.5.1 欲張りな動作の問題点
4.5.2 複数の文字による“クォート”
4.5.3 控え目な量指定子の使い方
4.5.4 欲張りでも控え目でも常にマッチ優先
4.5.5 欲張り、控え目、バックトラックの本質
4.5.6 絶対最大量指定子とアトミックグループ
4.5.7 絶対最大量指定子:?+、*+、++、{m,n}+
4.5.8 先後読みのバックトラック
4.5.9 選択は欲張りか
4.5.10 早い者勝ち選択の活用方法
4.6 NFA、DFA、POSIX
4.6.1 最左最長
4.6.2 POSIXと最左最長原則
4.6.3 スピードと効率
4.6.4 NFAとDFAの比較:まとめ
4.7 まとめ
5章 正規表現の実践的なテクニック
5.1 正規表現の平衡感覚
5.2 短めのサンプル
5.2.1 継続行の継続
5.2.2 IPアドレスへのマッチ
5.2.3 ファイル名の操作
5.2.4 括弧類の対へのマッチ
5.2.5 望ましくないマッチを減らすには
5.2.6 区切り子の入ったテキストへのマッチ
5.2.7 データの知識を活用して前提条件を意識する
5.2.8 先頭や末尾の空白の除去
5.3 HTML関連のサンプル
5.3.1 HTMLタグへのマッチ
5.3.2 HTMLリンクへのマッチ
5.3.3 HTTP URLの解析
5.3.4 ホスト名のチェック
5.3.5 URLを抽出する実用的なコード
5.4 高度なサンプル
5.4.1 データとの同期の確保
5.4.2 CSVファイルの走査
6章 効率のよい正規表現の作り方
6.1 酔いも醒めるようなサンプル
6.1.1 簡単な変更――効き足を先に
6.1.2 効率と正しさ
6.1.3 さらに改良――欲張りな動作の局所化
6.1.4 現実性のチェック
6.2 バックトラックの全体像
6.2.1 POSIX NFAの余分な仕事
6.2.2 マッチ不成功のときに必要な仕事
6.2.3 より厳密に
6.2.4 選択は高くつく場合がある
6.3 ベンチマークテスト
6.3.1 何を計測しているのかを把握する
6.3.2 PHPによるベンチマークテスト
6.3.3 Javaによるベンチマークテスト
6.3.4 VB.NETによるベンチマークテスト
6.3.5 Rubyによるベンチマークテスト
6.3.6 Pythonによるベンチマークテスト
6.3.7 Tclによるベンチマークテスト
6.4 よく見られる最適化
6.4.1 タダでは手に入らない
6.4.2 実装による違い
6.4.3 正規表現適用のメカニズム
6.4.4 適用前の最適化
6.4.5 トランスミッションの最適化
6.4.6 正規表現自体の最適化
6.5 より高速な正規表現を書くためのテクニック
6.5.1 常識的なテクニック
6.5.2 リテラルテキストを目立たせる
6.5.3 アンカーを目立たせる
6.5.4 最小量指定子と最大量指定子の使い分け
6.5.5 複数の正規表現への分割
6.5.6 先頭文字の識別の模倣
6.5.7 アトミックグループと絶対最大量指定子を使う
6.5.8 エンジンをマッチに導く
6.6 ループ展開
6.6.1 方法1:過去の経験に基づいて正規表現を組み立てる
6.6.2 本物の“ループ展開”パターン
6.6.3 方法2:トップダウンの視点
6.6.4 方法3:インターネットのホスト名
6.6.5 所見
6.6.6 アトミックグループや絶対最大量指定子を使った方法
6.6.7 ループ展開の簡単なサンプル
6.6.8 Cコメントのループ展開
6.7 スムーズに流れる正規表現
6.7.1 マッチを導く救いの手
6.7.2 正規表現を適切な方向に導いて高速化する
6.7.3 最後に
6.8 まとめ:考えよ!
7章 Perl
7.1 言語の構成要素としての正規表現
7.1.1 Perlの最大の長所
7.1.2 Perlの最大の弱点
7.2 正規表現のPerl方言
7.2.1 正規表現被演算子と正規表現リテラル
7.2.2 正規表現リテラルの走査の仕組み
7.2.3 正規表現修飾子
7.3 正規表現関連のPerlイズム
7.3.1 式のコンテキスト
7.3.2 動的スコープと正規表現マッチに対するその影響
7.3.3 マッチによって書き換えられる特殊変数
7.4 qr/…/演算子と正規表現オブジェクト
7.4.1 正規表現オブジェクトの作り方と使い方
7.4.2 正規表現オブジェクトの表示
7.4.3 効率向上のために正規表現オブジェクトを使う方法
7.5 マッチ演算子
7.5.1 マッチ演算子の正規表現被演算子
7.5.2 マッチターゲット被演算子の指定方法
7.5.3 マッチ演算子のさまざまな使い方
7.5.4 反復的なマッチ――/gありのスカラーコンテキスト
7.5.5 マッチ演算子と環境との関係
7.6 置換演算子
7.6.1 置換被演算子
7.6.2 /e修飾子
7.6.3 コンテキストと戻り値
7.7 split演算子
7.7.1 splitの基本
7.7.2 空要素
7.7.3 splitの特殊なマッチ被演算子
7.7.4 キャプチャ付き括弧を含むsplitのマッチ被演算子
7.8 Perlの拡張機能
7.8.1 動的正規表現を使って入れ子の対にマッチさせる
7.8.2 組み込みコードの使い方
7.8.3 組み込みコードでのlocalの使い方
7.8.4 組み込みコードとmy変数についての注意
7.8.5 組み込みコードを使った入れ子構造のマッチ
7.8.6 正規表現リテラルのオーバーロード
7.8.7 正規表現リテラルのオーバーロードに関する問題点
7.8.8 名前付きキャプチャの模倣
7.9 Perlの効率性の問題
7.9.1 やり方は1つではない
7.9.2 正規表現のコンパイルや/o修飾子、qr/…/と処理効率
7.9.3 “プレマッチ”コピーの動作
7.9.4 study関数
7.9.5 ベンチマークテスト
7.9.6 正規表現のデバッグ情報
7.10 最後に言っておきたいこと
8章 Java
8.1 正規表現のJava方言
8.1.1 Javaにおける\p{…}と\P{…}のサポート
8.1.2 Unicodeの行終端子
8.2 java.util.regexの使い方
8.3 Pattern.compile()ファクトリ
8.3.1 パターンのmatcherメソッド
8.4 Matcherオブジェクト
8.4.1 正規表現の適用
8.4.2 マッチの結果の問い合わせ
8.4.3 単純な置換
8.4.4 高度な置換
8.4.5 その場での置換
8.4.6 マッチャのリージョン
8.4.7 メソッドのチェーン化
8.4.8 字句解析器を作るためのメソッド
8.4.9 その他のマッチャメソッド
8.5 パターンのその他のメソッド
8.5.1 パターンのsplitメソッド(引数1個バージョン)
8.5.2 パターンのsplitメソッド(引数2個バージョン)
8.6 サンプルをもっと
8.6.1 IMGタグにWIDTH属性とHEIGHT属性を追加する
8.6.2 1つのマッチャで複数のパターンを使ってHTMLをチェックする
8.6.3 CSVテキストを走査する
8.7 Javaのバージョンによる違い
8.7.1 1.4.2と1.5.0との違い
8.7.2 1.5.0と1.6との違い
9章 .NET
9.1 正規表現の.NET方言
9.1.1 .NET方言についての補足
9.2 .NET正規表現の使い方
9.2.1 手っ取り早く正規表現を使うには
9.2.2 パッケージの概要
9.2.3 コアオブジェクトの概要
9.3 コアオブジェクトの詳細
9.3.1 Regexオブジェクトの作り方
9.3.2 Regexオブジェクトの使い方
9.3.3 Matchオブジェクトの使い方
9.3.4 Groupオブジェクトの使い方
9.4 ユーティリティ関数として使える静的関数
9.4.1 正規表現のキャッシング
9.5 サポート関数
9.6 .NET正規表現の高度な機能
9.6.1 正規表現アセンブリ
9.6.2 入れ子構造に対するマッチ
9.6.3 Captureオブジェクト
10章 PHP
10.1 正規表現のPHP方言
10.2 preg関数のインタフェース
10.2.1 “パターン”引数
10.3 preg関数
10.3.1 preg_match
10.3.2 preg_match_all
10.3.3 preg_replace
10.3.4 preg_replace_callback
10.3.5 preg_split
10.3.6 preg_grep
10.3.7 preg_quote
10.4 “欠けている”preg関数
10.4.1 正規表現文字列からpregパターン文字列への変換
10.4.2 未知のパターン引数の構文チェック
10.4.3 未知の正規表現の構文チェック
10.5 再帰式
10.5.1 括弧が入れ子構造になっているテキストとのマッチ
10.5.2 再帰の中へのバックトラック
10.5.3 入れ子構造になっている1組の括弧へのマッチ
10.6 PHPの処理効率の問題
10.6.1 Sパターン修飾子:“study”
10.7 サンプルコードをさらに
10.7.1 PHPによるCSV走査
10.7.2 タグ付きデータが適切な入れ子構造になっているかのチェック
索引