البحث والاستبدال

يمكنك التنقل بسهولة داخل المستند باستخدام لوحة المفاتيح والماوس، ولكن إذا كان لديك العديد من الصفحات للتمرير خلالها، فسوف يستغرق الأمر بعض الوقت للعثور على نص معين في مستند طويل. سيكون الأمر أكثر استهلاكا للوقت عندما تريد استبدال أحرف أو كلمات معينة استخدمتها في المستند الخاص بك. تتيح لك وظيفة" البحث والاستبدال " العثور على سلسلة من الأحرف في مستند واستبدالها بتسلسل آخر من الأحرف.

Aspose.Words يسمح لك بالعثور على سلسلة معينة أو نمط تعبير عادي في المستند واستبداله ببديل دون تثبيت واستخدام تطبيقات إضافية مثل Microsoft Word. سيؤدي ذلك إلى تسريع العديد من مهام الكتابة والتنسيق، مما قد يوفر لك ساعات من العمل.

تشرح هذه المقالة كيفية تطبيق استبدال السلسلة والتعبيرات العادية بدعم من الأحرف الأولية.

طرق لإيجاد واستبدال

Aspose.Words يوفر طريقتين لتطبيق عملية البحث والاستبدال باستخدام ما يلي:

  1. Simple string replacement - للعثور على سلسلة معينة واستبدالها بسلسلة أخرى، تحتاج إلى تحديد سلسلة بحث (أحرف أبجدية رقمية) سيتم استبدالها وفقا لجميع التكرارات بسلسلة استبدال أخرى محددة. يجب ألا تحتوي كلتا السلسلتين على رموز. ضع في اعتبارك أن مقارنة السلسلة يمكن أن تكون حساسة لحالة الأحرف، أو قد تكون غير متأكد من التهجئة أو لديك عدة تهجئات متشابهة.
  2. Regular expressions - لتحديد تعبير عادي للعثور على تطابقات السلسلة الدقيقة واستبدالها وفقا لتعبيرك العادي. لاحظ أنه يتم تعريف الكلمة على أنها تتكون من أحرف أبجدية رقمية فقط. إذا تم تنفيذ بديل مع مطابقة كلمات كاملة فقط وكانت سلسلة الإدخال تحتوي على رموز، فلن يتم العثور على عبارات.

أيضا، يمكنك استخدام الأحرف الأولية الخاصة مع استبدال سلسلة بسيطة والتعبيرات العادية لتحديد فواصل داخل عملية البحث والاستبدال.

Aspose.Words يعرض وظيفة البحث والاستبدال بـ 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");

يمكنك ملاحظة الفرق بين المستند قبل تطبيق استبدال سلسلة بسيطة:

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

وبعد تطبيق استبدال سلسلة بسيطة:

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

ابحث عن النص واستبدله باستخدام التعبيرات العادية

التعبير العادي (التعبير العادي) هو نمط يصف تسلسلا معينا من النص. لنفترض أنك تريد استبدال جميع التكرارات المزدوجة للكلمة بحدوث كلمة واحدة. ثم يمكنك تطبيق التعبير العادي التالي لتحديد نمط الكلمة المزدوجة: ([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");

يمكنك ملاحظة الفرق بين المستند قبل تطبيق استبدال السلسلة بالتعبيرات العادية:

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

وبعد تطبيق استبدال السلسلة بالتعبيرات العادية:

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

ابحث عن السلسلة واستبدلها باستخدام الأحرف الأولية

يمكنك استخدام الأحرف الأولية في سلسلة البحث أو سلسلة الاستبدال إذا كان نص أو عبارة معينة تتكون من فقرات أو أقسام أو صفحات متعددة. تتضمن بعض الأحرف الأولية &p لكسر فقرة، &b لكسر مقطع، &m لكسر صفحة، و &l لكسر سطر.

يوضح مثال التعليمات البرمجية التالية كيفية استبدال النص بالفقرة وفاصل الصفحة:

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

يمكنك العثور على النص واستبداله في قسم الرأس / التذييل في مستند ورد باستخدام فئة 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");

يمكنك ملاحظة الفرق بين المستند قبل تطبيق استبدال سلسلة الرأس:

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

وبعد تطبيق استبدال سلسلة الرأس:

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

مثال التعليمات البرمجية لاستبدال نص قسم التذييل في المستند مشابه جدا لمثال رمز الرأس السابق. كل ما عليك فعله هو استبدال الخطين التاليين:

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

مع ما يلي:

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

يمكنك ملاحظة الفرق بين المستند قبل تطبيق استبدال سلسلة التذييل:

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

وبعد تطبيق استبدال سلسلة تذييل الصفحة:

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

تجاهل النص أثناء البحث والاستبدال

أثناء تطبيق عملية البحث والاستبدال، يمكنك تجاهل أجزاء معينة من النص. لذلك، يمكن استبعاد أجزاء معينة من النص من البحث، ويمكن تطبيق البحث والاستبدال فقط على الأجزاء المتبقية.

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 لتخصيص عملية البحث والاستبدال بحيث تبدأ المطابقة في بداية التشغيل باستخدام عقدة المطابقة في المستند. دعونا نقدم عدة أمثلة على استخدام 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;
}
}