簡體   English   中英

替換 Word 文檔中的單詞會導致多次替換為 C#

[英]Replacing words in a Word document cause multiple times replacement with C#

我需要創建一個C#.NET 程序,它將搜索Microsoft Word 文檔中的特定單詞並將其替換為其他單詞。 例如,在我的 word 文件中有一個文本是 – LeadSoft IT 此“LeadSoft IT”將被替換為 – LeadSoft IT Limited 現在有一個問題是,LeadSoft IT 將在第一時間被LeadSoft IT Limited 取代。 但是,如果我再次運行該程序,它會再次更改 LeadSoft IT,而下次文本將是LeadSoft IT Limited Limited 這是個問題。 誰能建議我如何用 C# 代碼解決這個問題來替換 word 文檔中的單詞。

如果您已經有一些腳本,請隨時發布它,我會嘗試提供更多幫助。

我不確定您使用什么功能來查找文本實例,但我建議查看正則表達式,並使用諸如(LeadSoft IT(?! Limited))

正則表達式: https : //regexr.com/一個好的正則表達式測試器: https : //www.regextester.com/109925

編輯:我制作了一個使用正則表達式替換實例的 Python 腳本:

import re

word_doc = "We like working " \
           "here at Leadsoft IT.\n" \
           "We are not limited here at " \
           "Leadsoft It Limited."

replace_str = "Leadsoft IT Limited"

reg_str = '(Leadsoft IT(?!.?Limited))'

fixed_str = re.sub(reg_str, replace_str, word_doc, flags=re.IGNORECASE)

print(fixed_str)

# Prints:
# We like working here at Leadsoft IT Limited.
# We are not limited here at Leadsoft It Limited.

編輯 2:在 C# 中重新創建的代碼: https : //gist.github.com/Zylvian/47ecd6d1953b8d8c3900dc30645efe98

對於Leadsoft IT后面沒有Limited實例,正則表達式會檢查整個字符串,對於所有這些實例,將Leadsoft IT替換為Leadsoft IT Limited

正則表達式使用所謂的“負前瞻 (?!)”,確保左邊的字符串后面沒有右邊的字符串。 隨意編輯您認為合適的正則表達式,但請注意匹配性非常強。

如果您想更好地理解正則表達式字符串,請隨意將其復制到https://www.regextester.com/ 中

如果這有幫助,請告訴我!

簡單地說,您可以運行另一個替換來解決您導致的問題:

s = s.Replace("LeadSoft IT", "LeadSoft IT Limited").Replace("LeadSoft IT Limited Limited", "LeadSoft IT Limited");

如果您正在對此問題進行更通用的修復,而不是對問題字符串進行硬編碼,請考慮檢查您找到的字符串是否在您替換的字符串內,這意味着問題發生了。 這意味着您需要對文檔運行第二次替換,以找到在替換運行替換的結果

var find = "LeadSoft IT";
var repl = "LeadSoft IT Limited";

var result = document.Replace(find, repl);

var problemWillOccur = repl.Contains(find);

if(problemWillOccur){

  var fixProblemByFinding = repl.Replace(find, repl); //is "LeadSoft IT Limited Limited"

  result = result.Replace(fixProblemByFinding, repl);

}

你可能對我如何解決這個問題感興趣。 起初,我使用的是 NPOI,但它弄亂了文檔,所以我發現 DOCX 文件只是一個帶有 XML 的 ZIP 檔案。

https://github.com/kubala156/DociFlow/blob/main/DociFlow.Lib/Word/SeekAndReplace.cs

用法:

var vars = Dictionary<string, string>() 
{
    { "testtag", "Test tag value" }
}
using (var doci = new DociFlow.Lib.Word.SeekAndReplace())
{
    // test.docx contains text with tag "{{testtag}}" it will be replaced with "Test tag value"
    doci.Open("test.docx");
    doci.FindAndReplace(vars, "{{", "}}");
}

NPOI 2.5.4 提供了 ReplaceText 方法來幫助您替換 Word 文件中的占位符。

這是一個例子。 https://github.com/nissl-lab/npoi-examples/blob/main/xwpf/ReplaceTexts/Program.cs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM