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

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

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

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

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

Aspose.Words دو راه برای استفاده از عملیات find and replace با استفاده از موارد زیر فراهم می کند:

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

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

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

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

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

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Load a Word Docx document by creating an instance of the Document class.
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
builder->Writeln(u"Hello _CustomerName_, ");
// Specify the search string and replace string using the Replace method.
doc->get_Range()->Replace(u"_CustomerName_", u"James Bond", System::MakeObject<FindReplaceOptions>());
// Save the result.
System::String outputPath = outputDataDir + u"Range.ReplaceSimple.docx";
doc->Save(outputPath);

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

before-simple-string-replacement-aspose-words-cpp

و پس از استفاده از جایگزینی رشته ساده:

after-simple-string-replacement-aspose-words-cpp

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

یک عبارت منظم (regex) یک الگوی است که یک دنباله خاص از متن را توصیف می کند. فرض کنید می خواهید همه موارد دوگانه یک کلمه را با یک کلمه جایگزین کنید. سپس می توانید عبارت منظم زیر را برای مشخص کردن الگوی دو کلمه ای اعمال کنید: ([a-zA-Z]+) \1.

از روش Replace دیگر برای جستجو و جایگزینی ترکیب کاراکترهای خاص با تنظیم پارامتر Regex به عنوان الگوی عبارت منظم برای پیدا کردن مطابقت استفاده کنید.

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<Document> doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
builder->Writeln(u"sad mad bad");
System::SharedPtr<FindReplaceOptions> options = System::MakeObject<FindReplaceOptions>();
// Replaces all occurrences of the words "sad" or "mad" to "bad".
doc->get_Range()->Replace(System::MakeObject<System::Text::RegularExpressions::Regex>(u"[s|m]ad"), u"bad", options);
const System::String outputPath = outputDataDir + u"FindAndReplaceWithRegex_out.doc";
doc->Save(outputPath);

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

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

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

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

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

شما می توانید از متا کاراکترها در رشته جستجو یا رشته جایگزین استفاده کنید اگر یک متن یا عبارت خاص از چندین پاراگراف، بخش یا صفحه تشکیل شده باشد. برخی از متاکارکترها شامل &p برای یک پاراگراف، &b برای یک بخش، &m برای یک صفحه، و &l برای یک خط شکستن است.

مثال کد زیر نشان می دهد که چگونه متن را با پاراگراف و صفحه break جایگزین کنیم:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<Document> doc = System::MakeObject<Document>();
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
builder->get_Font()->set_Name(u"Arial");
builder->Writeln(u"First section");
builder->Writeln(u" 1st paragraph");
builder->Writeln(u" 2nd paragraph");
builder->Writeln(u"{insert-section}");
builder->Writeln(u"Second section");
builder->Writeln(u" 1st paragraph");
System::SharedPtr<FindReplaceOptions> options = System::MakeObject<FindReplaceOptions>();
options->get_ApplyParagraphFormat()->set_Alignment(ParagraphAlignment::Center);
// Double each paragraph break after word "section", add kind of underline and make it centered.
int32_t count = doc->get_Range()->Replace(u"section&p", u"section&p----------------------&p", options);
// Insert section break instead of custom text tag.
count = doc->get_Range()->Replace(u"{insert-section}", u"&b", options);
System::String savePath = outputDataDir + u"FindReplaceUsingMetaCharacters.ReplaceTextContaingMetaCharacters.docx";
doc->Save(savePath);

شما می توانید متن را در بخش header/footer یک سند Word با استفاده از کلاس HeaderFooter پیدا و جایگزین کنید.

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Open the template document, containing obsolete copyright information in the footer.
auto doc = System::MakeObject<Document>(inputDataDir + u"HeaderFooter.ReplaceText.doc");
// Access header of the Word document.
auto headersFooters = doc->get_FirstSection()->get_HeadersFooters();
auto header = headersFooters->idx_get(HeaderFooterType::HeaderPrimary);
// Set options.
auto options = System::MakeObject<FindReplaceOptions>();
options->set_MatchCase(false);
options->set_FindWholeWordsOnly(false);
// Replace text in the header of the Word document.
header->get_Range()->Replace(u"Aspose.Words", u"Remove", options);
auto footer = headersFooters->idx_get(HeaderFooterType::FooterPrimary);
footer->get_Range()->Replace(u"(C) 2006 Aspose Pty Ltd.", u"Copyright (C) Aspose Pty Ltd.", options);
// Save the Word document.
doc->Save(outputDataDir + u"HeaderReplace.docx");

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

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

و پس از استفاده از جایگزینی رشته هدر:

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

مثال کد برای جایگزینی متن بخش پاورقی در سند شما بسیار شبیه به مثال کد هدر قبلی است. تنها کاری که باید بکنی اینه که دو خط زیر رو عوض کنی:

auto header = headersFooters->idx_get(HeaderFooterType::HeaderPrimary);
header->get_Range()->Replace(u"Aspose.Words", u"Remove", options);

با موارد زیر:

auto footer = headersFooters->idx_get(HeaderFooterType::FooterPrimary);
footer->get_Range()->Replace(u"(C) 2006 Aspose Pty Ltd.", u"Copyright (C) Aspose Pty Ltd.", options);

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

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

و پس از استفاده از جایگزینی رشته فوتر:

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

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

در حین استفاده از عملیات 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-C
System::SharedPtr<Document> doc = System::MakeObject<Document>();
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Insert non-revised text.
builder->Writeln(u"Deleted");
builder->Write(u"Text");
// Remove first paragraph with tracking revisions.
doc->StartTrackRevisions(u"John Doe", System::DateTime::get_Now());
doc->get_FirstSection()->get_Body()->get_FirstParagraph()->Remove();
doc->StopTrackRevisions();
System::SharedPtr<FindReplaceOptions> options = System::MakeObject<FindReplaceOptions>();
// Replace 'e' in document while deleted text.
options->set_IgnoreDeleted(true);
doc->get_Range()->Replace(System::MakeObject<Regex>(u"e"), u"*", options);
std::cout << doc->GetText().ToUtf8String() << std::endl; // The output is: Deleted\rT*xt\f
// Replace 'e' in document NOT ignoring deleted text.
options->set_IgnoreDeleted(false);
doc->get_Range()->Replace(System::MakeObject<Regex>(u"e"), u"*", options);
std::cout << doc->GetText().ToUtf8String() << std::endl; // 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-C
// Highlight word "the" with yellow color.
auto options = System::MakeObject<FindReplaceOptions>();
options->get_ApplyFont()->set_HighlightColor(System::Drawing::Color::get_Yellow());
// Replace highlighted text.
doc->get_Range()->Replace(u"Hello", u"Hello", options);

Aspose.Words به شما اجازه می دهد تا از IReplacingCallback interface برای ایجاد و فراخوانی یک روش سفارشی در طول عملیات جایگزینی استفاده کنید. شما ممکن است برخی از موارد استفاده که در آن شما نیاز به سفارشی کردن پیدا کردن و جایگزین عملیات مانند جایگزینی متن مشخص شده با یک عبارت منظم با HTML برچسب، بنابراین اساسا شما با قرار دادن HTML جایگزین اعمال خواهد شد.

اگر شما نیاز به جایگزینی یک رشته با یک برچسب HTML دارید، رابط IReplacingCallback را برای سفارشی کردن عملیات find and replace اعمال کنید تا مطابقت در ابتدای یک اجرا با گره مطابقت سند شما شروع شود. اجازه دهید چند نمونه از استفاده از IReplacingCallback را ارائه دهیم.

مثال کد زیر نشان می دهد که چگونه متن مشخص شده را با HTMLجایگزین کنیم:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
class ReplaceWithHtmlEvaluator : public IReplacingCallback
{
typedef ReplaceWithHtmlEvaluator ThisType;
typedef IReplacingCallback BaseType;
typedef ::System::BaseTypesInfo<BaseType> ThisTypeBaseTypesInfo;
RTTI_INFO(ThisType, ThisTypeBaseTypesInfo);
public:
ReplaceWithHtmlEvaluator(System::SharedPtr<FindReplaceOptions> options);
ReplaceAction Replacing(System::SharedPtr<ReplacingArgs> args) override;
private:
System::SharedPtr<FindReplaceOptions> mOptions;
};
ReplaceWithHtmlEvaluator::ReplaceWithHtmlEvaluator(System::SharedPtr<FindReplaceOptions> options)
{
mOptions = options;
}
ReplaceAction ReplaceWithHtmlEvaluator::Replacing(System::SharedPtr<ReplacingArgs> args)
{
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(System::DynamicCast<Document>(args->get_MatchNode()->get_Document()));
builder->MoveTo(args->get_MatchNode());
// Replace '<CustomerName>' text with a red bold name.
builder->InsertHtml(u"<b><font color='red'>James Bond, </font></b>");
args->set_Replacement(u"");
return ReplaceAction::Replace;
}
void ReplaceWithHtml(System::String const& inputDataDir, System::String const& outputDataDir)
{
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
builder->Writeln(u"Hello <CustomerName>,");
auto options = System::MakeObject<FindReplaceOptions>();
auto optionsReplacingCallback = System::MakeObject<ReplaceWithHtmlEvaluator>(options);
doc->get_Range()->Replace(new Regex(u" <CustomerName>,"), System::String::Empty, options);
// Save the modified document.
doc->Save(outputDataDir + u"Range.ReplaceWithInsertHtml.doc");
}

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Replace and Highlight Numbers.
class NumberHighlightCallback : public IReplacingCallback
{
typedef NumberHighlightCallback ThisType;
typedef IReplacingCallback BaseType;
typedef ::System::BaseTypesInfo<BaseType> ThisTypeBaseTypesInfo;
RTTI_INFO(ThisType, ThisTypeBaseTypesInfo);
public:
NumberHighlightCallback(System::SharedPtr<FindReplaceOptions> const& opt)
: mOpt(opt) { }
Aspose::Words::Replacing::ReplaceAction Replacing(System::SharedPtr<Aspose::Words::Replacing::ReplacingArgs> args) override
{
// Let replacement to be the same text.
args->set_Replacement(args->get_Match()->get_Value());
auto val = System::Convert::ToInt32(args->get_Match()->get_Value());
// Apply either red or green color depending on the number value sign.
mOpt->get_ApplyFont()->set_Color(val > 0 ? System::Drawing::Color::get_Green() : System::Drawing::Color::get_Red());
return ReplaceAction::Replace;
}
private:
System::SharedPtr<FindReplaceOptions> mOpt;
};

مثال کد زیر نشان می دهد که چگونه یک شماره خط را به هر خط اضافه کنید:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
class LineCounterCallback : public IReplacingCallback
{
typedef LineCounterCallback ThisType;
typedef IReplacingCallback BaseType;
typedef ::System::BaseTypesInfo<BaseType> ThisTypeBaseTypesInfo;
RTTI_INFO(ThisType, ThisTypeBaseTypesInfo);
public:
Aspose::Words::Replacing::ReplaceAction Replacing(System::SharedPtr<Aspose::Words::Replacing::ReplacingArgs> args) override
{
std::cout << args->get_Match()->get_Value().ToUtf8String() << '\n';
args->set_Replacement(System::String::Format(u"{0} {1}", mCounter++, args->get_Match()->get_Value()));
return ReplaceAction::Replace;
}
private:
int32_t mCounter = 1;
};
void LineCounter(System::String const& inputDataDir, System::String const& outputDataDir)
{
// Create a document.
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Add lines of text.
builder->Writeln(u"This is first line");
builder->Writeln(u"Second line");
builder->Writeln(u"And last line");
// Prepend each line with line number.
auto opt = System::MakeObject<FindReplaceOptions>();
opt->set_ReplacingCallback(System::MakeObject<LineCounterCallback>());
doc->get_Range()->Replace(System::MakeObject<Regex>(u"[^&p]*&p"), u"", opt);
doc->Save(outputDataDir + u"TestLineCounter.docx");
}