查找和替换

查找和替换

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 风格的替换
基于回调的替换未按预期停止回调返回 Replace/Skip 而非 Stop当操作应结束时,从 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枚举控制每场比赛的结果:Replace, Skip, Stop

另请参阅

 中文