Aspose.Words for .NET查找和替換教程——如何查找和突出顯示文本
Aspose.Words For .Net是一種高級(jí)Word文檔處理API,用于執(zhí)行各種文檔管理和操作任務(wù)。API支持生成,修改,轉(zhuǎn)換,呈現(xiàn)和打印文檔,而無(wú)需在跨平臺(tái)應(yīng)用程序中直接使用Microsoft Word。此外,API支持所有流行的Word處理文件格式,并允許將Word文檔導(dǎo)出或轉(zhuǎn)換為固定布局文件格式和最常用的圖像/多媒體格式。
接下來(lái)我們將進(jìn)入“查找和替換”的介紹,在Aspose.Words中如何查找和突出顯示文本。
>>Aspose.Words for .NET更新至最新版v19.10,歡迎下載體驗(yàn)
Aspose優(yōu)惠進(jìn)行時(shí)——購(gòu)買(mǎi)Aspose系列產(chǎn)品可享限時(shí)優(yōu)惠!更多活動(dòng)詳情可咨詢?cè)诰€客服哦~
本文介紹如何使用Aspose.Words以編程方式查找和突出顯示文檔中的單詞或短語(yǔ)。在文檔中簡(jiǎn)單地查找文本字符串并更改其格式似乎很容易,但是主要的困難在于,由于格式問(wèn)題,匹配字符串可能會(huì)分布在多個(gè)文本行中??紤]以下示例。短語(yǔ)“ Hello World!”(如果已格式化)并包含三個(gè)不同的運(yùn)行:Hello為斜體,World為粗體,感嘆號(hào)為常規(guī)文本:
世界您好!
除了格式化外,文本中間的書(shū)簽還將其分成更多的行。) 上面的示例在Aspose.Words中使用以下對(duì)象表示:
Run (Run.Text = “Hello”, Font.Italic = true)
Run (Run.Text = “World”, Font.Bold = true)
Run (Run.Text = “!”)
該示例代碼將打開(kāi)一個(gè)文檔,并找到文本“您的文檔”的任何實(shí)例。設(shè)置了替換處理程序,以處理要應(yīng)用于找到的每個(gè)結(jié)果匹配項(xiàng)的邏輯。在這種情況下,結(jié)果運(yùn)行將圍繞文本進(jìn)行拆分,結(jié)果運(yùn)行將突出顯示。下面的示例查找并突出顯示W(wǎng)ord文檔中特定單詞或短語(yǔ)的所有實(shí)例。
//文檔目錄的路徑 string dataDir = RunExamples.GetDataDir_FindAndReplace(); string fileName = "TestFile.doc"; Document doc = new Document(dataDir + fileName); FindReplaceOptions options = new FindReplaceOptions(); options.ReplacingCallback = new ReplaceEvaluatorFindAndHighlight(); options.Direction = FindReplaceDirection.Backward; //我們希望突出顯示“您的文檔”短語(yǔ)。 Regex regex = new Regex("your document", RegexOptions.IgnoreCase); doc.Range.Replace(regex, "", options); dataDir = dataDir + RunExamples.GetOutputFilePath(fileName); //保存輸出文檔。 doc.Save(dataDir);
private class ReplaceEvaluatorFindAndHighlight : IReplacingCallback { /// <summary> /// Aspose.Words為每個(gè)匹配項(xiàng)查找并替換引擎調(diào)用此方法。 ///即使跨多個(gè)運(yùn)行,此方法也會(huì)突出顯示匹配字符串。 /// </summary> ReplaceAction IReplacingCallback.Replacing(ReplacingArgs e) { // 這是一個(gè)Run節(jié)點(diǎn),其中包含開(kāi)始或完全匹配。 Node currentNode = e.MatchNode; // 第一次(可能是唯一一次)運(yùn)行可以包含比賽前的文字, // 在這種情況下,有必要拆分運(yùn)行。 if (e.MatchOffset > 0) currentNode = SplitRun((Run)currentNode, e.MatchOffset); // 此數(shù)組用于存儲(chǔ)匹配的所有節(jié)點(diǎn)以進(jìn)一步突出顯示。 ArrayList runs = new ArrayList(); // 查找包含匹配字符串部分的所有運(yùn)行。 int remainingLength = e.Match.Value.Length; while ( (remainingLength > 0) && (currentNode != null) && (currentNode.GetText().Length <= remainingLength)) { runs.Add(currentNode); remainingLength = remainingLength - currentNode.GetText().Length; //選擇下一個(gè)“運(yùn)行”節(jié)點(diǎn)。 //必須循環(huán),因?yàn)榭赡苓€有其他節(jié)點(diǎn),例如BookmarkStart等。 do { currentNode = currentNode.NextSibling; } while ((currentNode != null) && (currentNode.NodeType != NodeType.Run)); } //如果剩余文本,則拆分包含該匹配項(xiàng)的最后一次運(yùn)行。 if ((currentNode != null) && (remainingLength > 0)) { SplitRun((Run)currentNode, remainingLength); runs.Add(currentNode); } //現(xiàn)在突出顯示序列中的所有運(yùn)行。 foreach (Run run in runs) run.Font.HighlightColor = Color.Yellow; //向替換引擎發(fā)出信號(hào),表示什么都不做,因?yàn)槲覀円呀?jīng)完成了所有想要做的事情。 return ReplaceAction.Skip; } }
/// <summary> /// 將指定運(yùn)行的文本分成兩個(gè)運(yùn)行。 /// 在指定的運(yùn)行之后插入新的運(yùn)行。 /// </summary> private static Run SplitRun(Run run, int position) { Run afterRun = (Run)run.Clone(true); afterRun.Text = run.Text.Substring(position); run.Text = run.Text.Substring(0, position); run.ParentNode.InsertAfter(afterRun, run); return afterRun; }
還想要更多嗎?您可以點(diǎn)擊閱讀【2019 · Aspose最新資源整合】,查找需要的教程資源。如果您有任何疑問(wèn)或需求,請(qǐng)隨時(shí)加入Aspose技術(shù)交流群(642018183),我們很高興為您提供查詢和咨詢。
如果您對(duì)Aspose有任何需求和疑難,記得掃描下方二維碼告訴我們哦~