Търсене и замяна

Можете лесно да навигирате във вашия документ с помощта на клавиатура и мишка, но ако имате много страници, през които да преминете, ще отнеме доста време, за да намерите конкретен текст в дълъг документ. Ще отнеме повече време, когато искате да замените определени символи или думи, които сте използвали в документа си. Функционалността на почерка ви позволява да намерите поредица от символи в документ и да го замените с друга поредица от символи.

Aspose.Words позволява да намерите конкретен низ или регулярен израз в документа си и да го замените с алтернатива, без да инсталирате и използвате допълнителни приложения като Microsoft Word. Това ще ускори много писане и форматиране задачи, потенциално спестявайки ви часове работа.

Тази статия обяснява как да се прилагат низ замяна и редовни изрази с подкрепата на мета символи.

Начини за намиране и замяна

Aspose.Words осигурява два начина за прилагане на операцията за намиране и замяна, като използва следното:

  1. Просто замяна на низ за да намерите и замените конкретен низ с друг, трябва да посочите низ за търсене (алфачислителни символи), който ще бъде заменен според всички събития с друг определен заместващ низ. И двата низа не трябва да съдържат символи. Като се има предвид, че сравнението на низовете може да бъде чувствено за случая, или може да не сте сигурни в правописа или да имате няколко подобни правописа.
  2. Регулярни изрази год. за да определите регулярен израз, за да намерите точния низ съвпадения и да ги замените според редовния си израз. Имайте предвид, че дадена дума се определя като съставена само от буквено-цифрови знаци. Ако заместващ се изпълнява само с цели думи, които се сравняват и входният низ съдържа символи, тогава няма да бъдат намерени фрази.

Също така, можете да използвате специални мета символи с прости низ замяна и редовни изрази, за да уточните прекъсвания в рамките на намирането и замяна на операция.

Aspose.Words представя функционалността на намиране и замяна с IReplacingCallBack. Можете да работите с много опции по време на намирането и замяната на процеса, като използвате FindReplaceOptions Клас.

Търсене и замяна на текст с помощта на проста замяна на низове

Можете да използвате един от Replace методи за намиране или замяна на определен низ и връщане на броя на направени заместители. В този случай можете да посочите низ, който да бъде заменен, низ, който ще замени всички негови събития, дали замяната е чувствителна към случай и дали ще бъдат засегнати само самостоятелни думи.

Следният пример за код показва как да намерите стринга гол.CriverName ..и да го замените със стринга * .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");

Можете да забележите разликата между документа, преди да приложите проста замяна на низове:

before-simple-string-replacement-aspose-words-java

И след прилагане на прост низ замяна:

after-simple-string-replacement-aspose-words-java

Търсене и замяна на текст, използвайки редовни изрази

Редовен израз (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");

Можете да забележите разликата между документа, преди да приложите замяна на низ с редовни изрази:

before-replacement-with-regular-expressions-aspose-words-java

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

after-replacement-with-regular-expressions-aspose-words-java

Намиране и замяна Струн Използване на мета символи

Можете да използвате мета символи в низа за търсене или заместващия низ, ако даден текст или фраза се състои от множество параграфи, раздели или страници. Някои от мета символите включват &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 документ с помощта на 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");

Можете да забележите разликата между документа, преди да приложите замяна на низ:

before-applying-header-string-replacement-aspose-words-java

И след прилагане на заглавна низ замяна:

after-applying-header-string-replacement-aspose-words-java

Примерът с кода за замяна на текста на секцията с подножието във вашия документ е много подобен на предишния заглавен код. Всичко, което трябва да направите, е да замените следните два реда:

HeaderFooter header = headersFooters.get(HeaderFooterType.HEADER_PRIMARY);
header.getRange().replace("Aspose.Words", "Remove", options);

Със следното:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
HeaderFooterCollection headersFooters = doc.getFirstSection().getHeadersFooters();
HeaderFooter footer = headersFooters.get(HeaderFooterType.FOOTER_PRIMARY);
// Replace text in the footer of the Word document.
int year = Calendar.getInstance().get(Calendar.YEAR);
footer.getRange().replace("(C) 2006 Aspose Pty Ltd.", "Copyright (C) " + year + " by Aspose Pty Ltd.", options);

Можете да забележите разликата между документа, преди да приложите замяна на низ:

before-applying-footer-string-replacement-aspose-words-java

И след прилагане на подметката на низа:

after-applying-footer-string-replacement-aspose-words-java

Игнориране на текст по време на намиране и замяна

Докато прилагате намерете и замените операцията, можете да игнорирате някои сегменти от текста. Така че някои части от текста могат да бъдат изключени от търсенето, а намирането и замяната могат да се прилагат само към останалите части.

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;
}
}