پیدا کنید و جایگزین کنید

شما به راحتی می توانید با استفاده از صفحه کلید و ماوس در سند خود حرکت کنید، اما اگر صفحات زیادی برای پیمایش دارید، یافتن متن خاصی در یک سند طولانی مدت زمان زیادی طول می کشد. زمانی که بخواهید نویسه‌ها یا کلمات خاصی را که در سند خود استفاده کرده‌اید جایگزین کنید زمان‌برتر خواهد بود. عملکرد “یافتن و جایگزینی” به شما امکان می دهد دنباله ای از کاراکترها را در یک سند پیدا کنید و آن را با دنباله دیگری از کاراکترها جایگزین کنید.

Aspose.Words به شما این امکان را می دهد که یک رشته خاص یا الگوی عبارت منظم را در سند خود پیدا کنید و بدون نصب و استفاده از برنامه های کاربردی اضافی مانند Microsoft Word آن را با یک جایگزین جایگزین کنید. این کار بسیاری از کارهای تایپ و قالب بندی را سرعت می بخشد و به طور بالقوه باعث صرفه جویی در ساعات کار شما می شود.

این مقاله نحوه اعمال جایگزینی رشته و عبارات منظم با پشتیبانی از متاکراکترها را توضیح می دهد.

راه هایی برای یافتن و جایگزینی

Aspose.Words با استفاده از موارد زیر دو راه را برای اعمال عملیات Find and جایگزین ارائه می دهد:

  1. تعویض رشته ساده – برای یافتن و جایگزینی یک رشته خاص با رشته دیگر، باید یک رشته جستجو (کاراکترهای الفبایی) را مشخص کنید که قرار است با توجه به همه موارد با یک رشته جایگزین مشخص شده دیگر جایگزین شود. هر دو رشته نباید دارای علامت باشند. در نظر بگیرید که مقایسه رشته می تواند به حروف کوچک و بزرگ حساس باشد، یا ممکن است از املای آن مطمئن نباشید یا چندین املای مشابه داشته باشید.
  2. عبارات منظم – برای تعیین یک عبارت منظم برای یافتن رشته های دقیق مطابق و جایگزینی آنها با توجه به عبارت منظم شما. توجه داشته باشید که یک کلمه به این صورت تعریف می شود که فقط از کاراکترهای الفبایی ساخته شده باشد. اگر جایگزینی فقط با کل کلمات مطابقت داده شود و رشته ورودی حاوی نمادها باشد، هیچ عبارتی پیدا نخواهد شد.

علاوه بر این، می‌توانید از متاکاراکترهای ویژه با جایگزینی رشته‌های ساده و عبارات منظم برای مشخص کردن شکست‌ها در عملیات find و جایگزین استفاده کنید.

Aspose.Words قابلیت یافتن و جایگزینی را با فضای نام Aspose.Words.Replacing ارائه می دهد. با استفاده از کلاس FindReplaceOptions می‌توانید با گزینه‌های زیادی در طول فرآیند Find and جایگزینی کار کنید.

یافتن و جایگزینی متن با استفاده از جایگزین رشته ساده

می‌توانید از یکی از روش‌های Replace برای یافتن یا جایگزینی یک رشته خاص استفاده کنید و تعداد جایگزین‌های انجام شده را برگردانید. در این مورد، می‌توانید رشته‌ای را برای جایگزینی تعیین کنید، رشته‌ای که جایگزین همه موارد آن می‌شود، اینکه آیا جایگزینی به حروف بزرگ و کوچک حساس است یا نه و آیا فقط کلمات مستقل تحت تأثیر قرار می‌گیرند.

مثال کد زیر نشان می دهد که چگونه می توان رشته “CustomerName” را پیدا کرد و آن را با رشته “James Bond” جایگزین کرد:

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

می توانید قبل از اعمال جایگزینی رشته با عبارات منظم، تفاوت بین سند را متوجه شوید:

قبل از جایگزینی با عبارات منظم

و پس از اعمال جایگزینی رشته با عبارات منظم:

بعد از جایگزینی با عبارات منظم

یافتن و جایگزینی رشته با استفاده از متاکاراکترهای

اگر متن یا عبارت خاصی از چند پاراگراف، بخش یا صفحه تشکیل شده باشد، می‌توانید از متاکاراکترها در رشته جستجو یا رشته جایگزین استفاده کنید. برخی از متاکاراکترها عبارتند از برای شکست پاراگراف، &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);

می‌توانید با استفاده از کلاس HeaderFooter، متنی را در قسمت سرصفحه/پانویس یک سند Word پیدا کرده و جایگزین کنید.

مثال کد زیر نشان می دهد که چگونه متن قسمت هدر را در سند خود جایگزین کنید:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// 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.FirstSection.HeadersFooters;
HeaderFooter header = headersFooters[HeaderFooterType.HeaderPrimary];
// Set options.
FindReplaceOptions options = new FindReplaceOptions
{
MatchCase = false,
FindWholeWordsOnly = false
};
// Replace text in the header of the Word document.
header.Range.Replace("Aspose.Words", "Remove", options);
// Save the Word document.
doc.Save(dataDir + "HeaderReplace.docx");

قبل از اعمال جایگزینی رشته هدر می توانید تفاوت بین سند را مشاهده کنید:

قبل از اعمال-هدر-رشته-جایگزینی

و پس از اعمال جایگزینی رشته هدر:

جایگزینی رشته سربرگ بعد از اعمال

مثال کد برای جایگزینی متن بخش فوتر در سند شما بسیار شبیه به مثال کد سرصفحه قبلی است. تنها کاری که باید انجام دهید این است که دو خط زیر را جایگزین کنید:

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

قبل از اعمال جایگزینی رشته پاورقی، می توانید تفاوت بین سند را متوجه شوید:

قبل از اعمال-جایگزینی-فوتر-رشته

و پس از اعمال جایگزینی رشته فوتر:

پس از اعمال-جایگزینی-فوتر-رشته

در حین یافتن و جایگزینی {#ignore-text-during-find-and-replace}، متن را نادیده بگیرید

در حین اعمال عملیات یافتن و جایگزینی، می توانید بخش های خاصی از متن را نادیده بگیرید. بنابراین، بخش‌های خاصی از متن را می‌توان از جستجو حذف کرد و یافتن و جایگزینی را می‌توان فقط برای قسمت‌های باقی‌مانده اعمال کرد.

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

یافتن و جایگزینی عملیات {#customize-find-and-replace-operation} را سفارشی کنید

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