Знайти і замінити
Ви можете легко орієнтуватися в документі за допомогою клавіатури і миші, але якщо у вас є багато сторінок, щоб прокрутити через, це займе досить багато часу, щоб знайти конкретний текст у довгому документі. Якщо ви хочете замінити певні символи або слова, які ви використовували в документі. Функціональність “Фінд і заміна” дозволяє знайти послідовність символів в документі і замінити його ще однією послідовністю символів.
Aspose.Words дозволяє знайти конкретний рядок або регулярний вираз у вашому документі і замінити його альтернативою без встановлення та використання додаткових додатків, таких як Microsoft Wordй Це дозволить прискорити багато завдань, які форматують, потенційно заощаджуючи час роботи.
Ця стаття пояснює, як застосувати заміну рядків та регулярні вирази за підтримки метахарактерів.
Способи пошуку і заміни
Aspose.Words надає два способи застосування функції пошуку та заміни за допомогою:
1,1 км Проста заміна рядків – знайти і замінити певну рядок з іншим, потрібно вказати рядок пошуку (альфа-нумеричні символи), який буде замінено на всі випадки з іншим заданим рядком заміни. Обидва рядки не повинні містити символи. Враховуйте, що порівняння рядків може бути справжньою, або ви можете бути невиліковними або мати кілька подібних заклинання. 2. Пошукові вирази – вказати формальний вираз, щоб знайти відповідні рядки та замінити їх відповідно до формального виразу. Зауважте, що слово визначено, як проводиться тільки альфа-цифрові символи. Якщо заміна виконана тільки цілими словами, які відповідають, і вхідний рядок відбувається, щоб містити символи, то не знайдено фраз.
Також можна використовувати спеціальні метахарактери з простою заміною рядків та регулярними виразами, щоб вказати перерви в межах функції пошуку та заміни.
Aspose.Words презентує функцію пошуку та заміни IReplacingCallBackй Ви можете працювати з багатьма опціями під час пошуку та заміни процесу за допомогою FindReplaceOptions клас.
Знайдіть і замініть текст за допомогою простої заміни String
Ви можете використовувати один з Replace методи пошуку або заміни певного рядка і повернення кількості замін, які були зроблені. У цьому випадку можна вказати рядок, який буде замінено на всі його появи, чи є заміна випадку-чутливим, і чи будуть вражені тільки самостійні слова.
Приклад коду показує, як знайти рядок “CustomerName” і замінити його на рядок * “James Bond”*:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// Load a Word DOCX document by creating an instance of the Document class. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.writeln("Hello _CustomerName_,"); | |
// Specify the search string and replace string using the Replace method. | |
doc.getRange().replace("_CustomerName_", "James Bond", new FindReplaceOptions()); | |
// Save the result. | |
doc.save(dataDir + "Range.ReplaceSimple.docx"); |
Ви можете помітити різницю між документом, перш ніж застосувати простий заміну рядків:

І після застосування простий заміну рядків:

Знайти і замінити текст за допомогою регулярних виразів
Звичайний вираз (regex) є шаблоном, який описує певну послідовність тексту. Ви хочете замінити всі подвійні появи слова з однозначним словом. Потім ви можете застосувати наступний формальний вираз, щоб вказати шаблон подвійного слова: ([a-zA-Z]+) \1
й
Використовуйте інші Replace метод пошуку та заміни окремих комбінацій символів шляхом налаштування Regex
параметр як звичайний шаблон виразу для пошуку матчів.
Приклад наступного коду показує, як замінити рядки, які відповідають формальному виразному шаблону з вказаною заміною рядка:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.writeln("sad mad bad"); | |
if(doc.getText().trim() == "sad mad bad") | |
{ | |
System.out.println("Strings are equal!"); | |
} | |
// Replaces all occurrences of the words "sad" or "mad" to "bad". | |
FindReplaceOptions options = new FindReplaceOptions(); | |
doc.getRange().replace(Pattern.compile("[s|m]ad"), "bad", options); | |
// Save the Word document. | |
doc.save(dataDir + "Range.ReplaceWithRegex.docx"); |
Ви можете помітити різницю між документом перед заміною рядків з формальними виразами:

І після застосування заміни рядка з формальними виразами:

Пошук і заміна String Використання Metacharacters
Ви можете використовувати метахарактери в рядок пошуку або рядок заміни, якщо конкретний текст або фраза складається з декількох абзаців, розділів або сторінок. Деякі з метахарактів включають &p для абзацу, &b для розбиття секції, &m для перерву сторінок і &l для розбиття лінії.
Приклад наступного коду показує, як замінити текст з абзацу та перерву сторінок:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.getFont().setName("Arial"); | |
builder.writeln("First section"); | |
builder.writeln(" 1st paragraph"); | |
builder.writeln(" 2nd paragraph"); | |
builder.writeln("{insert-section}"); | |
builder.writeln("Second section"); | |
builder.writeln(" 1st paragraph"); | |
FindReplaceOptions options = new FindReplaceOptions(); | |
options.getApplyParagraphFormat().setAlignment(ParagraphAlignment.CENTER); | |
// Double each paragraph break after word "section", add kind of underline and make it centered. | |
int count = doc.getRange().replace("section&p", "section&p----------------------&p", options); | |
// Insert section break instead of custom text tag. | |
count = doc.getRange().replace("{insert-section}", "&b", options); | |
doc.save(dataDir + "ReplaceTextContaingMetaCharacters_out.docx"); |
Знайти і замінити Рядок в заголовку / нижній колонтитул документа
Ви можете знайти та замінити текст у розділі заголовок / нижній колонтитул документа Word за допомогою документа Word HeaderFooter клас.
Приклад коду показує, як замінити текст розділу заголовка у документі:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// Open the template document, containing obsolete copyright information in the footer. | |
Document doc = new Document(dataDir + "HeaderFooter.ReplaceText.doc"); | |
// Access header of the Word document. | |
HeaderFooterCollection headersFooters = doc.getFirstSection().getHeadersFooters(); | |
HeaderFooter header = headersFooters.get(HeaderFooterType.HEADER_PRIMARY); | |
// Set options. | |
FindReplaceOptions options = new FindReplaceOptions(); | |
options.setMatchCase(false); | |
options.setFindWholeWordsOnly(false); | |
// Replace text in the header of the Word document. | |
header.getRange().replace("Aspose.Words", "Remove", options); | |
// Save the Word document. | |
doc.save(dataDir + "HeaderReplace.docx"); |
Ви можете помітити різницю між документом перед заміною рядків заголовка:

І після внесення заміни рядків заголовка:

Приклад коду для заміни тексту розділу нижнього колонтитула в документі дуже схожий на попередній приклад коду заголовка. Все, що потрібно зробити, це замінити наступні два рядки:
HeaderFooter header = headersFooters.get(HeaderFooterType.HEADER_PRIMARY);
header.getRange().replace("Aspose.Words", "Remove", options);
З наступним:
Ви можете помітити різницю між документом перед заміною рядків нижнього колонтитула:

І після застосування заміни рядків нижнього колонки:

Ігнорувати текст під час пошуку та заміни
В той час як застосувати функцію пошуку та заміни, ви можете ігнорувати певні сегменти тексту. Таким чином, деякі частини тексту можна виключити з пошуку, а пошук і заміну можна застосувати тільки до інших частин.
Aspose.Words надає багато знахідок і замінних властивостей для ігнорування тексту, таких як IgnoreDeleted, IgnoreFieldCodes, IgnoreFields, IgnoreFootnotes, і IgnoreInsertedй
Приклад наступного коду показує, як ігнорувати текст всередині видалення записів:
// Create new document. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Insert non-revised text. | |
builder.writeln("Deleted"); | |
builder.write("Text"); | |
// Remove first paragraph with tracking revisions. | |
doc.startTrackRevisions("author", new Date()); | |
doc.getFirstSection().getBody().getFirstParagraph().remove(); | |
doc.stopTrackRevisions(); | |
Pattern regex = Pattern.compile("e", Pattern.CASE_INSENSITIVE); | |
FindReplaceOptions options = new FindReplaceOptions(); | |
// Replace 'e' in document ignoring deleted text. | |
options.setIgnoreDeleted(true); | |
doc.getRange().replace(regex, "*", options); | |
System.out.println(doc.getText()); // The output is: Deleted\rT*xt\f | |
// Replace 'e' in document NOT ignoring deleted text. | |
options.setIgnoreDeleted(false); | |
doc.getRange().replace(regex, "*", options); | |
System.out.println(doc.getText()); // The output is: D*l*t*d\rT*xt\f |
Налаштування пошуку та заміни операцій
Aspose.Words багато різних properties щоб знайти і замінити текст, наприклад, застосування певного формату з ApplyFont і ApplyParagraphFormats властивості, використовуючи заміщення в замінних візерунках з UseSubstitutions майно та інші.
Приклад коду показує, як виділити конкретне слово у вашому документі:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// Highlight word "the" with yellow color. | |
FindReplaceOptions options = new FindReplaceOptions(); | |
options.getApplyFont().setHighlightColor(Color.YELLOW); | |
// Replace highlighted text. | |
doc.getRange().replace("the", "the", options); |
Aspose.Words дозволяє використовувати IReplacingCallback інтерфейс для створення та виклику користувацького методу під час операції заміни. Ви можете мати деякі випадки використання, де вам потрібно налаштувати роботу пошуку та заміни, наприклад, заміну тексту, зазначеного з формальним виразом з тегами HTML, так що в основному ви будете застосувати заміну з вставкою HTML.
Якщо потрібно замінити рядок з тегом HTML, нанесіть IReplacingCallback інтерфейс для налаштування пошуку та заміни операції, так що матч починається на початку запуску з відповідною вершиною вашого документа. Ми надаємо кілька прикладів IReplacingCallbackй
Приклад коду показує, як замінити текст, зазначений за допомогою HTML:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
public static void ReplaceWithHtml() throws Exception { | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.writeln("Hello <CustomerName>,"); | |
FindReplaceOptions options = new FindReplaceOptions(); | |
options.setReplacingCallback(new ReplaceWithHtmlEvaluator()); | |
doc.getRange().replace(Pattern.compile(" <CustomerName>,"), "", options); | |
//doc.getRange().replace(" <CustomerName>,", html, options); | |
// Save the modified document. | |
doc.save(dataDir + "Range.ReplaceWithInsertHtml.doc"); | |
System.out.println("\nText replaced with meta characters successfully.\nFile saved at " + dataDir); | |
} | |
static class ReplaceWithHtmlEvaluator implements IReplacingCallback { | |
public int replacing(ReplacingArgs e) throws Exception { | |
// This is a Run node that contains either the beginning or the complete match. | |
Node currentNode = e.getMatchNode(); | |
// create Document Buidler and insert MergeField | |
DocumentBuilder builder = new DocumentBuilder((Document) e.getMatchNode().getDocument()); | |
builder.moveTo(currentNode); | |
// Replace '<CustomerName>' text with a red bold name. | |
builder.insertHtml("<b><font color='red'>James Bond, </font></b>");e.getReplacement(); | |
currentNode.remove(); | |
//Signal to the replace engine to do nothing because we have already done all what we wanted. | |
return ReplaceAction.SKIP; | |
} | |
} |
Приклад коду показує, як виділити позитивні числа з зеленим кольором і негативними числами з червоним кольором:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// Replace and Highlight Numbers. | |
static class NumberHighlightCallback implements IReplacingCallback { | |
public int replacing (ReplacingArgs args) throws Exception { | |
Node currentNode = args.getMatchNode(); | |
// Let replacement to be the same text. | |
args.setReplacement(currentNode.getText()); | |
int val = currentNode.hashCode(); | |
// Apply either red or green color depending on the number value sign. | |
FindReplaceOptions options = new FindReplaceOptions(); | |
if(val > 0) | |
{ | |
options.getApplyFont().setColor(Color.GREEN); | |
} | |
else | |
{ | |
options.getApplyFont().setColor(Color.RED); | |
} | |
return ReplaceAction.REPLACE; | |
} | |
} |
Приклад коду показує, як додати номер рядка до кожного рядка:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
public static void TestLineCounter() throws Exception { | |
// Create a document. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Add lines of text. | |
builder.writeln("This is first line"); | |
builder.writeln("Second line"); | |
builder.writeln("And last line"); | |
// Prepend each line with line number. | |
FindReplaceOptions opt = new FindReplaceOptions(); | |
opt.setReplacingCallback(new LineCounterCallback()); | |
doc.getRange().replace(Pattern.compile("[^&p]*&p"), "", opt); | |
doc.save(dataDir + "TestLineCounter.docx"); | |
} | |
static class LineCounterCallback implements IReplacingCallback | |
{ | |
private int mCounter = 1; | |
public int replacing(ReplacingArgs args) throws Exception { | |
Node currentNode = args.getMatchNode(); | |
System.out.println(currentNode.getText()); | |
args.setReplacement(mCounter++ +"."+ currentNode.getText()); | |
return ReplaceAction.REPLACE; | |
} | |
} |