Знайти та замінити
Знайти та замінити
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() |
ReplaceAction | Enum, що контролює результат кожного матчу: Replace, Skip, Stop |