پیدا کردن و جایگزین کردن
شما به راحتی می توانید با استفاده از یک صفحه کلید و ماوس در سند خود حرکت کنید، اما اگر صفحات زیادی برای حرکت دارید، مدتی طول می کشد تا متن خاصی را در یک سند طولانی پیدا کنید. وقتی می خواهید کاراکترها یا کلمات خاصی را که در سند خود استفاده کرده اید جایگزین کنید، زمان بیشتری می برد. قابلیت “Find and replace” شما را قادر می سازد تا یک دنباله از کاراکترها را در یک سند پیدا کنید و آن را با دنباله دیگری از کاراکترها جایگزین کنید.
Aspose.Words به شما اجازه می دهد تا یک رشته خاص یا الگوی بیان منظم را در سند خود پیدا کنید و آن را با یک جایگزین بدون نصب و استفاده از برنامه های اضافی مانند Microsoft Word جایگزین کنید. این کار بسیاری از کارهای تایپ و قالب بندی را تسریع می کند و به طور بالقوه ساعت ها کار شما را صرفه جویی می کند.
این مقاله توضیح می دهد که چگونه جایگزین رشته و عبارات منظم را با پشتیبانی از متا کاراکترها اعمال کنیم.
راه های پیدا کردن و جایگزین کردن
Aspose.Words دو راه برای استفاده از عملیات find and replace با استفاده از موارد زیر فراهم می کند:
- Simple string replacement - برای پیدا کردن و جایگزینی یک رشته خاص با رشته دیگر، باید یک رشته جستجو (کاراکترهای حروف و اعداد) را مشخص کنید که با توجه به همه موارد با یک رشته جایگزین مشخص شده جایگزین می شود. هر دو رشته نباید حاوی نمادها باشند. توجه داشته باشید که مقایسه رشته می تواند حساس به حروف بزرگ و کوچک باشد، یا ممکن است از املا مطمئن نباشید یا چندین املای مشابه داشته باشید.
- Regular expressions - برای مشخص کردن یک عبارت منظم برای پیدا کردن مطابقت دقیق رشته و جایگزینی آنها با توجه به عبارت منظم خود. توجه داشته باشید که یک کلمه فقط از حروف و اعداد تشکیل شده است. اگر یک جایگزین با فقط کلمات کامل مطابقت داشته باشد و رشته ورودی حاوی نمادها باشد، پس هیچ عبارتی پیدا نخواهد شد.
همچنین، می توانید از متاکاراکتورهای ویژه با جایگزینی رشته ساده و عبارات منظم برای مشخص کردن شکستگی در عملیات find and replace استفاده کنید.
Aspose.Words قابلیت find and replace را با IReplacingCallBack ارائه می دهد. شما می توانید با گزینه های بسیاری در طول فرآیند پیدا کردن و جایگزینی با استفاده از کلاس FindReplaceOptions کار کنید.
پیدا کردن و جایگزینی متن با استفاده از جایگزینی رشته ساده
شما می توانید از یکی از روش های Replace برای پیدا کردن یا جایگزینی یک رشته خاص و بازگرداندن تعداد جایگزین هایی که ساخته شده اند استفاده کنید. در این حالت، می توانید رشته ای را که باید تعویض شود مشخص کنید، رشته ای که جایگزین همه موارد آن می شود، آیا جایگزینی حساس به حروف بزرگ و کوچک است و آیا فقط کلمات مستقل تحت تأثیر قرار می گیرند.
مثال کد زیر نشان می دهد که چگونه رشته “CustomerName " را پیدا کنید و آن را با رشته *“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"); |
قبل از استفاده از جایگزینی رشته ساده می توانید تفاوت بین سند را مشاهده کنید:

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

پیدا کردن و جایگزینی متن با استفاده از عبارات منظم
یک عبارت منظم (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"); |
شما می توانید تفاوت بین سند را قبل از استفاده از جایگزینی رشته با عبارات منظم مشاهده کنید:

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

پیدا کردن و جایگزینی رشته با استفاده از Metacharacters
شما می توانید از متا کاراکترها در رشته جستجو یا رشته جایگزین استفاده کنید اگر یک متن یا عبارت خاص از چندین پاراگراف، بخش یا صفحه تشکیل شده باشد. برخی از متاکارکترها شامل &p برای یک پاراگراف، &b برای یک بخش، &m برای یک صفحه، و &l برای یک خط شکستن است.
مثال کد زیر نشان می دهد که چگونه متن را با پاراگراف و صفحه break جایگزین کنیم:
// 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"); |
رشته را در هدر/پای یک سند پیدا و جایگزین کنید
شما می توانید متن را در بخش header/footer یک سند 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"); |
قبل از استفاده از جایگزینی رشته هدر می توانید تفاوت بین سند را مشاهده کنید:

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

مثال کد برای جایگزینی متن بخش پاورقی در سند شما بسیار شبیه به مثال کد هدر قبلی است. تنها کاری که باید بکنی اینه که دو خط زیر رو عوض کنی:
HeaderFooter header = headersFooters.get(HeaderFooterType.HEADER_PRIMARY);
header.getRange().replace("Aspose.Words", "Remove", options);
با موارد زیر:
قبل از استفاده از جایگزینی رشته فوتر می توانید تفاوت بین سند را مشاهده کنید:

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

متن را در هنگام یافتن و جایگزینی نادیده بگیرید
در حین استفاده از عملیات find and replace، می توانید بخش های خاصی از متن را نادیده بگیرید. بنابراین، بخش های خاصی از متن را می توان از جستجو حذف کرد و پیدا کردن و جایگزینی را می توان تنها به بخش های باقی مانده اعمال کرد.
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 را برای سفارشی کردن عملیات find and replace اعمال کنید تا مطابقت در ابتدای یک اجرا با گره مطابقت سند شما شروع شود. اجازه دهید چند نمونه از استفاده از 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; | |
} | |
} |