[英]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.