Найти и заменить
Найти и заменить
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 |