Arama ve Değiştir

Bir belgeyi kolayca bir klavye ve fare kullanarak gezinebilirsiniz, ancak birçok sayfayı kaydırmanız gerekiyorsa uzun bir belgedeki belirli metni bulmak oldukça zaman alacaktır. Belirli karakterleri veya bir belgede kullandığınız kelimeleri değiştirmek istediğinizde daha fazla zaman alacaktır. ‘Bul ve değiştir’ işlevi, bir belge içinde karakter dizisini başka bir karakter dizisiyle değiştirebileceğinizi gösterir.

Bu Aspose.Words sizin belgenizde belirli bir dizeyi veya düzenli ifade desenini bulmanıza ve onu ekstra uygulamalar gibi Microsoft Word yüklemeden ve kullanmadan alternatifle değiştirmenize izin verir. Bu yazma ve biçimlendirme görevlerini hızlandıracak, muhtemelen size saatlerce iş kurtaracak.

Bu makale, meta karakter desteğiyle normal ifadeler kullanarak string değiştirme yöntemini açıklamaktadır.

Bulmak ve Değiştirmek İçin Yollar

Aspose.Words aşağıdaki seçenekleri kullanarak bul ve değiştir işlemini uygulamak için iki yol sağlar:

  1. Basit dize değiştirme – belirli bir dizeyi başka bir dize ile değiştirmek için arama dizesini (alfanümerik karakterler) belirtmeniz gerekir ki bu, başka bir belirtilen değiştirme dizesiyle tüm oluşumları değiştirerek değiştirilir. Her iki dizede de semboller içermemelidir. Dikkat edin ki dize karşılaştırması büyük/küçük harfe duyarlı olabilir ya da imla konusunda emin olmayabilirsiniz veya birkaç benzer yazımınız olabilir.
  2. Düzenli ifadeler - tam eşleşmeleri bulmak ve bunları düzenli ifadelerinize göre değiştirmek için bir düzenli ifade belirtin. Bir kelimenin yalnızca alfanümerik karakterler oluşturduğu not alın. Tam eşleşmelerle değiştirilen bir yedekleme gerçekleştirilirse ve giriş dizesi herhangi bir sembol içeriyorsa hiçbir cümle bulunmaz.

Ayrıca, basit dizgi değiştirme ve düzenli ifadeler kullanarak özel metakarakterleri belirtebilirsiniz. “Bul ve Değiştir” işleminde kesintiler oluşturabilirsiniz.

Aspose.Words bulma ve değiştirme işlevselliğini sunar IReplacingCallBack. Birden çok seçeneği bulma ve değiştirme işlemi sırasında FindReplaceOptions sınıfı kullanarak çalışabilirsiniz.

Basit Basınım Değiştirme ile Metin Bul ve Değiştir

Belirli bir dizeyi bulmak veya değiştirmek için Replace yönteminden birini kullanabilirsiniz ve yapılan değişikliklerin sayısını döndürün. Bu durumda, değiştirilecek olan dize, tüm oluşumları değiştirecek olan dize, büyük/küçük harf duyarlılığı ve yalnızca ayrı duran kelimelerin etkilenip etkilenmeyeceği belirtilebilir.

Aşağıdaki kod örneği, “MüşteriAdı” dizgisini nasıl bulacağını ve onu ““James Bond”” dizgisiyle değiştireceğini göstermektedir:

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

Basit dize değiştirmeden önce belge arasındaki farkı fark edebilirsiniz:

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

Basit dizgi değiştirme uyguladıktan sonra:

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

Düzenli İfadelerle Metin Bul ve Değiştir

Bir normal ifade (regex) belirli bir metin dizisini tanımlayan bir kalıptır. Şunu varsayın, bir sözcüğün çift oluşumlarını tek bir oluşumla değiştirmek istiyorsunuz. Bu durumda, çift sözcük kalıbını belirtmek için aşağıdaki normal ifadeyi uygulayabilirsiniz: ([a-zA-Z]+) \1.

Arama ve belirli karakter kombinasyonlarını değiştirme için diğer Replace yöntemini kullanın ve eşleşmeleri bulmak için normal ifade deseni olarak Regex parametresini ayarlayın.

Aşağıdaki kod örneği, bir normal ifade kalıbıyla eşleşen dizeleri belirtilen bir değiştirme dizesiyle nasıl değiştireceğinizi gösterir:

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

Düzenli ifadelerle string değiştirme uygulamasından önce belgenin farkını fark edebilirsiniz:

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

Düzenli ifadelerle dize değiştirme uyguladıktan sonra:

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

Metakarakterler Kullanılarak Bul ve Değiştir String

Bir paragraf, bölüm veya sayfa içeren belirli bir metin veya ifadeyi aramak için arama dizesinde veya değiştirme dizesinde metakarakterleri kullanabilirsiniz. Bazı metakarakterler arasında bir paragraf kırılması için &p, bir bölüm kırılması için &b, bir sayfa kırılması için &m ve bir satır kırılması için &l bulunur.

Aşağıdaki kod örneği, paragraf ve sayfa aralığı ile metin değiştirmenin nasıl yapılacağını göstermektedir:

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

Word belgesi üstbilgi/altbilgi bölümündeki metinleri bulup değiştirebilirsiniz HeaderFooter sınıfı.

Aşağıdaki kod örneği belgenizin başlık bölümünde yer alan metni nasıl değiştireceğinizi göstermektedir:

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

Başlık dizesi değiştirme uygulandıktan sonraki belge arasındaki farkı gözlemleyebilirsiniz:

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

Ve üstbilgi dizesi değiştirme uyguladıktan sonra:

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

Koddaki örneği, belgenizin altbilgisi bölümünün metnini değiştirmek için, önceki başlık kodu örneğine çok benziyor. Tek yapmanız gereken iki satırı değiştirmektir:

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

Aşağıdaki ile beraber:

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

Başlatmadan önce belge arasındaki farkı görebilirsiniz:

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

Ve altbilgi dizesi değiştirme uygulandıktan sonra:

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

Bul ve Değiştir Sırasında Metin İhmal Et

Bul ve değiştir işlemini uygularken, metnin belirli bölümlerini göz ardı edebilirsin. Böylece, metnin bazı bölümleri aranmaktan çıkarılabilir ve bul ve değiştir yalnızca kalan parçalara uygulanabilir.

Aspose.Words IgnoreDeleted, IgnoreFieldCodes, IgnoreFields, IgnoreFootnotes ve IgnoreInserted' gibi metni göz ardı etmek için birçok bul ve değiştir özelliği sağlar.

Aşağıdaki kod örneğinde, silme revizyonları içindeki metin nasıl görmezden gelindiğini gösterir:

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

Arama ve Değiştirme Operasyonunu Özelleştir

Aspose.Words birçok farklı properties‘i bulmak ve değiştirmek için sağlar metin, örneğin belirli bir biçimle ApplyFont ve ApplyParagraphFormats özellikleri uygulayarak, değiştirme desenlerinde UseSubstitutions özelliğine sahip yer tutucuları kullanarak ve diğerleri.

Aşağıdaki kod örneği, belgenizdeki belirli bir kelimeyi nasıl vurgulayacağınızı gösterir:

// 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 size, bir değiştirmek için bir özel yöntem oluşturmak ve çağırmak için IReplacingCallback arayüzünü kullanmanızı sağlar. Bulma ve değiştirme işlemini özelleştirmek istediğiniz bazı kullanım durumları olabilir örneğin bir düzenli ifadeyle belirtilen metni HTML etiketleriyle değiştirmek, bu nedenle temelde HTML ekleyerek değiştirme uygulayacaksınız.

Bir dizeyi bir HTML etiketiyle değiştirmek zorunda kalırsanız, bul ve değiştir işlemini özelleştirmek için IReplacingCallback arayüzünü uygulayın böylece eşleşme sizin belgenizdeki eşleşme düğümü ile bir koşulun başında başlar. Birkaç IReplacingCallback kullanım örneği sağlayalım.

Aşağıdaki kod örneği, belirtilen metin ile HTML’yi nasıl değiştireceğinizi gösterir:

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

Aşağıdaki kod örneği yeşil renk ile pozitif sayıları ve kırmızı renk ile negatif sayıları nasıl vurgulayacağını göstermektedir:

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

Aşağıdaki kod örneği, her satıra bir satır numarası eklemeyi gösterir:

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