検索と置換
検索と置換
Aspose.Words FOSS for .NET は、Range.Replace() を通じた正規表現ベースの検索と置換を提供し、FindReplaceOptions で構成可能で、上級シナリオ向けには Aspose.Words.Replacing 名前空間からのカスタム IReplacingCallback 実装を利用できます。
基本的な検索と置換
Range.Replace(pattern, replacement) は、範囲全体にわたって正規表現検索置換を実行します—Document.Range 上で呼び出された場合は文書全体です。Replace(pattern, replacement, options) のオーバーロードは、より細かい制御のために FindReplaceOptions オブジェクトを受け取ります:MatchCase と FindWholeWordsOnly がマッチ動作を調整し、Direction(FindReplaceDirection の値、Forward または Backward)が検索方向を制御し、ApplyFont / ApplyParagraphFormat は置換が新しいテキストだけでなく新しい書式設定を保持できるようにします。
書式認識および構造オプション
FindReplaceOptions には、マッチが横断または無視できる文書構造を決定する複数のフラグが含まれます:IgnoreDeleted と IgnoreInserted は、変更履歴コンテンツがマッチに参加するかどうかを制御し、IgnoreFields と IgnoreFieldCodes はフィールド結果テキストとフィールドコードが検索対象になるかを制御し、IgnoreFootnotes は脚注/文末脚注のコンテンツを除外し、IgnoreStructuredDocumentTags と IgnoreShapes はそれぞれコンテンツコントロールと図形テキストを除外します。UseSubstitutions は置換文字列で正規表現置換構文($1 のような)を有効にします。LegacyMode と UseLegacyOrder は、以前のロジックで処理された文書との互換性のために古いマッチング動作を保持します。
IReplacingCallback を使用したカスタム置換ロジック
固定の置換文字列として表現できない置換ロジックについては、IReplacingCallback とその唯一の Replacing(args) メソッドを実装し、その実装を FindReplaceOptions.ReplacingCallback に割り当てます(または FindReplaceOptions(replacingCallback) コンストラクタに直接渡します)。コールバックは各マッチに対して ReplacingArgs オブジェクトを受け取り、Match(基礎となる正規表現のマッチ)、MatchNode / MatchEndNode(マッチを含む文書ノード)、MatchOffset、および設定可能な Replacement 文字列を公開します。コールバックから ReplaceAction 値を返すこと—Replace、Skip、または Stop—により、その特定のマッチが置換されるか、そのままにされるか、あるいは検索/置換操作全体が停止するかが制御されます。
ヒントとベストプラクティス
- 文書全体の置換には
Document.Rangeに対してReplace()を呼び出し、操作の範囲を限定したい場合は(単一セクションの範囲など)より狭いRangeに対して呼び出します。 - 検索語が長い単語のサブストリングとしてマッチしないようにするには、
FindWholeWordsOnly = trueを設定します。 - 置換を基礎となるフィールド指示テキストではなく、表示されたフィールド結果に対して行いたい場合は、
IgnoreFieldCodes = trueを使用します。 - 置換テキストが固定文字列ではなく、マッチコンテキスト(周囲のノード、書式設定、位置など)に依存する場合は、事後処理よりも
IReplacingCallbackを優先してください。 - 条件が満たされたら、残りのすべてのマッチを処理する代わりに、コールバックから
ReplaceAction.Stopを返して検索/置換操作を早期に終了させます。
一般的な問題
| 問題 | 原因 | 修正 |
|---|---|---|
| 置換が新しい書式を適用しません | ApplyFont/ApplyParagraphFormat が FindReplaceOptions に設定されていません | options オブジェクトに関連するフォーマットプロパティを設定します |
| トラッキング変更の削除内で予期せず一致が見つかりました | IgnoreDeleted がデフォルトのまま残っています | 削除されたリビジョンの内容をスキップするには、IgnoreDeleted = true を設定します |
| 置換テキスト内の正規表現グループ参照が置換されていません | UseSubstitutions が有効ではありません | UseSubstitutions = true を設定して、$1 スタイルの置換を有効にします |
| コールバックベースの置換が期待通りに停止しません | コールバックが Stop の代わりに Replace/Skip を返します | 操作が終了すべきときに、Replacing() から ReplaceAction.Stop を返します |
FAQ
Range.Replace() は正規表現をサポートしていますか?
はい — pattern 引数は正規表現で、範囲のテキストに対してマッチします。
文書全体ではなく、特定のセクション内だけのテキストを置換するにはどうすればよいですか?
そのセクションの Range に対して Replace() を呼び出し、Document.Range の代わりに使用してください。
マッチした内容に応じて置換テキストを変えるにはどうすればよいですか?
IReplacingCallback を実装し、ReplacingArgs からマッチの詳細を読み取り、ReplacingArgs.Replacement に計算されたテキストを設定し、ReplaceAction.Replace を返します。
文書全体を逆方向に検索して置換できますか?
はい — FindReplaceOptions.Direction を FindReplaceDirection.Backward に設定してください。
API Reference の概要
| クラス / メソッド | 説明 |
|---|---|
Range.Replace() | 範囲全体で正規表現の検索/置換を行い、オプションで FindReplaceOptions を使用します |
FindReplaceOptions | 置換操作のためのマッチ動作、フォーマット、および構造スコープを構成します |
FindReplaceDirection | 列挙型: Forward, Backward |
IReplacingCallback | カスタムのマッチごとの置換ロジック用インターフェース |
ReplacingArgs | マッチごとのデータが IReplacingCallback.Replacing() に渡されます |
ReplaceAction | マッチごとの結果を制御するEnum: Replace, Skip, Stop |