Знайти та замінити

Знайти та замінити

Aspose.Words FOSS для .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()
ReplaceActionEnum, що контролює результат кожного матчу: Replace, Skip, Stop

Дивіться також

 Українська