Найти и заменить

Найти и заменить

Aspose.Words FOSS for .NET предоставляет поиск и замену на основе регулярных выражений через Range.Replace(), настраиваемый через FindReplaceOptions и, для продвинутых сценариев, пользовательскую реализацию IReplacingCallback из пространства имён Aspose.Words.Replacing.


Базовый поиск и замена

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 — определяет, будет ли конкретное совпадение заменено, оставлено без изменений или прервёт всю операцию поиска/замены.


Советы и лучшие практики

  • Вызовите Replace() на Document.Range для замены по всему документу или на более узком Range (например, диапазоне отдельного раздела), чтобы ограничить область операции.
  • Установите FindWholeWordsOnly = true, чтобы избежать совпадения поискового терма как подстроки более длинного слова.
  • Используйте IgnoreFieldCodes = true, когда хотите, чтобы замена применялась к отображаемым результатам поля, а не к исходному тексту инструкции поля.
  • Отдавайте предпочтение IReplacingCallback вместо постобработки, когда текст замены зависит от контекста совпадения (окружающего узла, форматирования или позиции), а не является фиксированной строкой.
  • Верните ReplaceAction.Stop из обратного вызова, чтобы преждевременно завершить операцию поиска/замены, как только условие выполнено, вместо обработки всех оставшихся совпадений.

Типичные проблемы

ПроблемаПричинаИсправление
Замена не применяет новое форматированиеApplyFont/ApplyParagraphFormat не установлен(а) на FindReplaceOptionsУстановите соответствующие свойства форматирования в объекте options
Неожиданно найдены совпадения внутри удалений отслеживаемых измененийIgnoreDeleted оставлен(а) по умолчаниюУстановитеIgnoreDeleted = true,чтобыпропуститьудалённоесодержимоеревизии.
Ссылки на группы regex в тексте замены не подставляютсяUseSubstitutions не включенУстановите UseSubstitutions = true, чтобы включить подстановку в стиле $1
Замена, основанная на обратных вызовах, не останавливается, как ожидалосьОбратный вызов возвращает Replace/Skip вместо StopВерните ReplaceAction.Stop из Replacing(), когда операция должна завершиться

FAQ

Поддерживает ли Range.Replace() регулярные выражения?

Да — аргумент pattern представляет собой регулярное выражение, сопоставляемое с текстом диапазона.

Как заменить текст только в конкретном разделе, а не во всём документе?

Вызовите Replace() на Range этого раздела вместо 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

См. также:

 Русский