Търсене и замяна
Можете лесно да навигирате във вашия документ с помощта на клавиатура и мишка, но ако имате много страници, през които да преминете, ще отнеме доста време, за да намерите конкретен текст в дълъг документ. Ще отнеме повече време, когато искате да замените определени символи или думи, които сте използвали в документа си. Фиксирането и подмяната на функционалността ви позволява да намерите поредица от символи в документ и да го замените с друга поредица от символи.
Aspose.Words позволява да намерите конкретен низ или регулярен израз в документа си и да го замените с алтернатива, без да инсталирате и използвате допълнителни приложения като Microsoft Word. Това ще ускори много писане и форматиране задачи, потенциално спестявайки ви часове работа.
Тази статия обяснява как да се прилагат низ замяна и редовни изрази с подкрепата на мета символи.
Начини за намиране и замяна
Aspose.Words осигурява два начина за прилагане на операцията за намиране и замяна, като използва следното:
- Просто замяна на низ за да намерите и замените конкретен низ с друг, трябва да посочите низ за търсене (алфачислителни символи), който ще бъде заменен според всички събития с друг определен низ за замяна. И двата низа не трябва да съдържат символи. Като се има предвид, че сравнението на низовете може да бъде от гледна точка на случая, или може да не сте сигурни в правописа или да имате няколко подобни правописа.
- Регулярни изрази гответе регулярен израз, за да намерите точния низ мачове и да ги замените според редовния си израз. Имайте предвид, че думата се определя като съставена само от буквено-цифрови знаци. Ако заместването се изпълнява само с цели думи, които се сравняват и входният низ съдържа символи, тогава няма да бъдат намерени фрази.
В допълнение, можете да използвате специални метахарактери с прости низ замяна и редовни изрази, за да се определят прекъсвания в рамките на намирането и замяна на операция.
Aspose.Words представя функционалността за намиране и замяна с Aspose.Words.Replacing пространство за имена. Можете да работите с много възможности по време на намирането и замяната на процеса с помощта на FindReplaceOptions Клас.
Търсене и замяна на текст с помощта на прост низ замяна
Можете да използвате един от Replace методи за намиране или замяна на определен низ и връщане на броя на направени заместители. В този случай можете да посочите низ, който да бъде заменен, низ, който ще замени всички негови събития, дали замяната е чувствителна към случая и дали ще бъдат засегнати само самостоятелни думи.
Следният пример за код показва как да се намери стринга …CnustrName… и да го замените със стринга *.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// 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.Range.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-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.Writeln("sad mad bad"); | |
Assert.AreEqual("sad mad bad", doc.GetText().Trim()); | |
// Replaces all occurrences of the words "sad" or "mad" to "bad". | |
doc.Range.Replace(new Regex("[s|m]ad"), "bad"); | |
// Save the Word document. | |
doc.Save("Range.ReplaceWithRegex.docx"); |
Можете да забележите разликата между документа преди прилагане на низ замяна с редовни изрази:

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

Намерете и сменете низ използвайки мета символи
Можете да използвате мета символи в низа за търсене или в низа за замяна, ако даден текст или фраза се състои от няколко параграфи, раздели или страници. Някои от мета символите включват &p за прекъсване на параграфа, &b за прекъсване на раздел, &m за прекъсване на страницата, и &l за прекъсване на линията.
Следният пример за код показва как да замените текст с параграф и страница с прекъсване:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.Font.Name = "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.ApplyParagraphFormat.Alignment = ParagraphAlignment.Center; | |
// Double each paragraph break after word "section", add kind of underline and make it centered. | |
int count = doc.Range.Replace("section&p", "section&p----------------------&p", options); | |
// Insert section break instead of custom text tag. | |
count = doc.Range.Replace("{insert-section}", "&b", options); | |
dataDir = dataDir + "ReplaceTextContaingMetaCharacters_out.docx"; | |
doc.Save(dataDir); |
Намерете и заменете низ в заглавната част/футър на документ
Можете да намерите и замените текста в раздела заглавна / крак на Word документ с помощта на HeaderFooter Клас.
Следният пример за код показва как да замените текста на заглавието в документа си:
Можете да забележите разликата между документа, преди да приложите замяна на низ:

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

Примерът с кода за замяна на текста на раздел footer във вашия документ е много подобен на предишния заглавен код пример. Всичко, което трябва да направите, е да замените следните два реда:
HeaderFooter header = headersFooters[HeaderFooterType.HeaderPrimary];
header.Range.Replace("Aspose.Words", "Remove", options);
Със следното:
HeaderFooter footer = headersFooters[HeaderFooterType.FooterPrimary];
int currentYear = System.DateTime.Now.Year;
footer.Range.Replace("(C) 2006 Aspose Pty Ltd.", $"Copyright (C) {currentYear} by Aspose Pty Ltd.", options);
Можете да забележите разликата между документа, преди да приложите замяна на низ:

И след като нанесете замяна на низ:

Игнориране на текст по време на намиране и замяна
Докато прилагате намерете и замените операцията, можете да игнорирате някои сегменти от текста. Така че някои части от текста могат да бъдат изключени от търсенето, а намирането и замяната могат да се прилагат само към останалите части.
Aspose.Words осигурява много намери и замени свойства за игнориране на текст като IgnoreDeleted, IgnoreFieldCodes, IgnoreFields, IgnoreFootnotes, както и IgnoreInserted.
Следният пример за код показва как да игнорирате текст вътре изтрийте ревизиите:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
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("John Doe", DateTime.Now); | |
doc.FirstSection.Body.FirstParagraph.Remove(); | |
doc.StopTrackRevisions(); | |
Regex regex = new Regex("e"); | |
FindReplaceOptions options = new FindReplaceOptions(); | |
// Replace 'e' in document while ignoring deleted text. | |
options.IgnoreDeleted = true; | |
doc.Range.Replace(regex, "*", options); | |
Assert.AreEqual(doc.GetText().Trim(), "Deleted\rT*xt"); | |
// Replace 'e' in document while not ignoring deleted text. | |
options.IgnoreDeleted = false; | |
doc.Range.Replace(regex, "*", options); |
Персонализиране Търсене и замяна на операция
Aspose.Words осигурява много различни properties да намери и замени текст, като например прилагане на специфичен формат с ApplyFont както и ApplyParagraphFormats свойства, като се използват заместители в резервни модели с UseSubstitutions собственост и други.
Следният пример за код показва как да се подчертае конкретна дума във вашия документ:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// Highlight word "the" with yellow color. | |
FindReplaceOptions options = new FindReplaceOptions(); | |
options.ApplyFont.HighlightColor = Color.Yellow; | |
// Replace highlighted text. | |
doc.Range.Replace("Hello", "Hello", 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-.NET | |
public static void ReplaceWithHtml(string dataDir) | |
{ | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.Writeln("Hello <CustomerName>,"); | |
FindReplaceOptions options = new FindReplaceOptions(); | |
options.ReplacingCallback = new ReplaceWithHtmlEvaluator(options); | |
doc.Range.Replace(new Regex(@" <CustomerName>,"), String.Empty, options); | |
// Save the modified document. | |
doc.Save(dataDir + "Range.ReplaceWithInsertHtml.doc"); | |
} | |
private class ReplaceWithHtmlEvaluator : IReplacingCallback | |
{ | |
internal ReplaceWithHtmlEvaluator(FindReplaceOptions options) | |
{ | |
mOptions = options; | |
} | |
//This simplistic method will only work well when the match starts at the beginning of a run. | |
ReplaceAction IReplacingCallback.Replacing(ReplacingArgs args) | |
{ | |
DocumentBuilder builder = new DocumentBuilder((Document)args.MatchNode.Document); | |
builder.MoveTo(args.MatchNode); | |
// Replace '<CustomerName>' text with a red bold name. | |
builder.InsertHtml("<b><font color='red'>James Bond, </font></b>"); args.Replacement = ""; | |
return ReplaceAction.Replace; | |
} | |
private readonly FindReplaceOptions mOptions; | |
} |
Следният пример за код показва как да се подчертае положителни числа със зелен цвят и отрицателни числа с червен цвят:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// Replace and Highlight Numbers. | |
internal class NumberHighlightCallback : IReplacingCallback | |
{ | |
public NumberHighlightCallback(FindReplaceOptions opt) | |
{ | |
mOpt = opt; | |
} | |
public ReplaceAction Replacing(ReplacingArgs args) | |
{ | |
// Let replacement to be the same text. | |
args.Replacement = args.Match.Value; | |
int val = int.Parse(args.Match.Value); | |
// Apply either red or green color depending on the number value sign. | |
mOpt.ApplyFont.Color = (val > 0) | |
? Color.Green | |
: Color.Red; | |
return ReplaceAction.Replace; | |
} | |
private readonly FindReplaceOptions mOpt; | |
} |
Следният пример с код показва как да се прекара номер на линия на всеки ред:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
public void LineCounter() | |
{ | |
// 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() { ReplacingCallback = new LineCounterCallback() }; | |
doc.Range.Replace(new Regex("[^&p]*&p"), "", opt); | |
doc.Save(@"X:\TestLineCounter.docx"); | |
} | |
internal class LineCounterCallback : IReplacingCallback | |
{ | |
public ReplaceAction Replacing(ReplacingArgs args) | |
{ | |
Debug.WriteLine(args.Match.Value); | |
args.Replacement = string.Format("{0} {1}", mCounter++, args.Match.Value); | |
return ReplaceAction.Replace; | |
} | |
private int mCounter = 1; | |
} |