Găsiți și înlocuiți

Puteți naviga cu ușurință în documentul dvs. folosind o tastatură și un mouse, dar dacă aveți multe pagini de parcurs, va dura destul de mult timp pentru a găsi un anumit text într-un document lung. Va consuma mai mult timp atunci când doriți să înlocuiți anumite caractere sau cuvinte pe care le-ați folosit în documentul dvs. Funcționalitatea “găsiți și înlocuiți” vă permite să găsiți o secvență de caractere într-un document și să o înlocuiți cu o altă secvență de caractere.

Aspose.Words vă permite să găsiți un anumit șir sau un model de expresie regulată în documentul dvs. și să îl înlocuiți cu o alternativă fără a instala și utiliza aplicații suplimentare, cum ar fi Microsoft Word. Acest lucru va accelera multe sarcini de tastare și formatare, economisind potențial ore de lucru.

Acest articol explică modul de aplicare a înlocuirii șirurilor și a expresiilor regulate cu sprijinul metacaracterelor.

Modalități de a găsi și înlocui

Aspose.Words oferă două moduri de a aplica operația de găsire și înlocuire utilizând următoarele:

  1. Simple string replacement - pentru a găsi și înlocui un șir specific cu altul, trebuie să specificați un șir de căutare (caractere alfanumerice) care va fi înlocuit în funcție de toate aparițiile cu un alt șir de înlocuire specificat. Ambele șiruri nu trebuie să conțină simboluri. Luați în considerare faptul că compararea șirurilor poate fi sensibilă la majuscule și minuscule sau este posibil să nu fiți sigur de ortografie sau să aveți mai multe ortografii similare.
  2. Regular expressions - pentru a specifica o expresie regulată pentru a găsi potrivirile exacte ale șirului și a le înlocui în funcție de expresia dvs. regulată. Rețineți că un cuvânt este definit ca fiind alcătuit doar din caractere alfanumerice. Dacă o înlocuire este executată cu doar cuvinte întregi potrivite și șirul de intrare conține simboluri, atunci nu vor fi găsite fraze.

De asemenea, puteți utiliza metacaractere speciale cu înlocuire simplă a șirurilor și expresii regulate pentru a specifica pauze în cadrul operației de găsire și înlocuire.

Aspose.Words prezintă funcționalitatea Găsire și înlocuire cu IReplacingCallBack. Puteți lucra cu multe opțiuni în timpul procesului de găsire și înlocuire folosind clasa FindReplaceOptions.

Găsiți și înlocuiți textul folosind înlocuirea simplă a șirurilor

Puteți utiliza una dintre metodele Replace pentru a găsi sau înlocui un anumit șir și pentru a returna numărul de înlocuiri care au fost făcute. În acest caz, puteți specifica un șir de înlocuit, un șir care va înlocui toate aparițiile sale, dacă înlocuirea este sensibilă la majuscule și minuscule și dacă vor fi afectate doar cuvintele de sine stătătoare.

Următorul exemplu de cod arată cum să găsiți șirul “CustomerName " și să îl înlocuiți cu șirul “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");

Puteți observa diferența dintre document înainte de a aplica înlocuirea simplă a șirului:

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

Și după aplicarea înlocuirii simple a șirului:

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

Găsiți și înlocuiți textul folosind expresii regulate

O expresie regulată (regex) este un model care descrie o anumită secvență de text. Să presupunem că doriți să înlocuiți toate aparițiile duble ale unui cuvânt cu un singur cuvânt. Apoi puteți aplica următoarea expresie regulată pentru a specifica modelul cu două cuvinte: ([a-zA-Z]+) \1.

Utilizați cealaltă metodă Replace pentru a căuta și înlocui anumite combinații de caractere setând parametrul Regex ca model de expresie regulată pentru a găsi potriviri.

Următorul exemplu de cod arată cum să înlocuiți șirurile care se potrivesc cu un model de expresie regulată cu un șir de înlocuire specificat:

// 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");

Puteți observa diferența dintre document înainte de a aplica înlocuirea șirului cu expresii regulate:

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

Și după aplicarea înlocuirii șirului cu expresii regulate:

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

Găsiți și înlocuiți șirul folosind metacaractere

Puteți utiliza metacaractere în șirul de căutare sau în șirul de înlocuire dacă un anumit text sau expresie este compus din mai multe paragrafe, secțiuni sau pagini. Unele dintre metacaractere includ &p pentru o pauză de paragraf, &b pentru o pauză de secțiune, &m pentru o pauză de pagină și &l pentru o pauză de linie.

Următorul exemplu de cod arată cum să înlocuiți textul cu paragraf și pauză de pagină:

// 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");

Puteți găsi și înlocui textul în secțiunea antet/subsol a unui document Word folosind clasa HeaderFooter.

Următorul exemplu de cod arată cum să înlocuiți textul secțiunii antet din documentul dvs:

// 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");

Puteți observa diferența dintre document înainte de a aplica înlocuirea șirului de antet:

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

Și după aplicarea înlocuirii șirului de antet:

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

Exemplul de cod pentru a înlocui textul secțiunii subsol din documentul dvs. este foarte similar cu exemplul de cod antet anterior. Tot ce trebuie să faceți este să înlocuiți următoarele două linii:

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

Cu următoarele:

// 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);

Puteți observa diferența dintre document înainte de a aplica înlocuirea șirului de subsol:

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

Și după aplicarea înlocuirii șirului de subsol:

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

Ignorați textul în timpul găsirii și înlocuirii

În timp ce aplicați operația de găsire și înlocuire, puteți ignora anumite segmente ale textului. Deci, anumite părți ale textului pot fi excluse din căutare, iar găsirea și înlocuirea pot fi aplicate numai părților rămase.

Aspose.Words oferă multe proprietăți de găsire și înlocuire pentru ignorarea textului, cum ar fi IgnoreDeleted, IgnoreFieldCodes, IgnoreFields, IgnoreFootnotes, și IgnoreInserted.

Următorul exemplu de cod arată cum să ignorați textul din interiorul reviziilor de ștergere:

// 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

Personalizați operația de găsire și înlocuire

Aspose.Words oferă multe properties diferite pentru a găsi și înlocui text, cum ar fi aplicarea unui format specific cu ApplyFont și ApplyParagraphFormats proprietăți, folosind substituții în modele de înlocuire cu UseSubstitutions proprietate și altele.

Următorul exemplu de cod arată cum să evidențiați un anumit cuvânt în documentul dvs:

// 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 vă permite să utilizați interfața IReplacingCallback pentru a crea și a apela o metodă personalizată în timpul unei operații de înlocuire. Este posibil să aveți unele cazuri de utilizare în care trebuie să personalizați operațiunea găsiți și înlocuiți, cum ar fi înlocuirea textului specificat cu o expresie regulată cu etichete HTML, deci practic veți aplica înlocuiți cu inserarea HTML.

Dacă trebuie să înlocuiți un șir cu o etichetă HTML, Aplicați interfața IReplacingCallback pentru a personaliza operația de găsire și înlocuire, astfel încât potrivirea să înceapă la începutul unei rulări cu nodul de potrivire al documentului dvs. Să oferim câteva exemple de utilizare a IReplacingCallback.

Următorul exemplu de cod arată cum să înlocuiți textul specificat cu 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;
}
}

Următorul exemplu de cod arată cum să evidențiați numerele pozitive cu culoarea verde și numerele negative cu culoarea roșie:

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

Următorul exemplu de cod arată cum să prependați un număr de linie la fiecare linie:

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