magazine.gif詳説 正規表現 第3版

はじめに

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 タグ付きデータが適切な入れ子構造になっているかのチェック

索引