替换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。这是个问题。谁能建议我如何用 C# 代码解决这个问题来替换 word 文档中的单词。

如果您已经有一些脚本,请随时 post 它,我会尽力提供更多帮助。

我不确定您使用什么功能来查找文本实例,但我建议您查看正则表达式,并使用 (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# 中的代码 re-created: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