C# 替换Word文档中的单词会导致多次使用C替换#

C# 替换Word文档中的单词会导致多次使用C替换#,c#,ms-word,C#,Ms Word,我需要创建一个C#.NET程序,该程序将搜索Microsoft Word文档中的特定单词,并将其替换为其他单词。例如,在我的word文件中有一个文本–LeadSoft IT。此“LeadSoft IT”将由–LeadSoft IT Limited取代。现在有一个问题,第一次LeadSoft IT将被LeadSoft IT Limited取代。但如果我再次运行该程序,它将再次更改LeadSoft it,并且在下一次中,文本将LeadSoft it Limited。这是一个问题。有谁能建议我如何用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文档中的单词来解决这个问题。

如果你已经有了一些脚本,请随意发布,我会尽力提供更多帮助

我不确定您正在使用什么功能来查找文本实例,但我建议您查看regex,并使用类似于
(LeadSoft IT(?!Limited))
的东西

正则表达式: 一个好的正则表达式测试器:

编辑:我制作了一个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#中重新创建的代码:

正则表达式检查整个字符串是否有
Leadsoft IT
后面没有
Limited
的实例,对于所有这些实例,将
Leadsoft IT
替换为
Leadsoft IT Limited

正则表达式使用所谓的“负前瞻(?!”,确保左边的字符串后面不跟右边的字符串。您可以随意编辑正则表达式,但要注意匹配性非常强

如果您想更好地理解正则表达式字符串,可以将其复制到


如果有帮助,请告诉我

如果你已经有了这方面的脚本,请随意发布,我会尽力提供更多帮助

我不确定您正在使用什么功能来查找文本实例,但我建议您查看regex,并使用类似于
(LeadSoft IT(?!Limited))
的东西

正则表达式: 一个好的正则表达式测试器:

编辑:我制作了一个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#中重新创建的代码:

正则表达式检查整个字符串是否有
Leadsoft IT
后面没有
Limited
的实例,对于所有这些实例,将
Leadsoft IT
替换为
Leadsoft IT Limited

正则表达式使用所谓的“负前瞻(?!”,确保左边的字符串后面不跟右边的字符串。您可以随意编辑正则表达式,但要注意匹配性非常强

如果您想更好地理解正则表达式字符串,可以将其复制到


如果有帮助,请告诉我

简单地说,您可以运行另一个替换来修复您造成的问题:

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

如果你在对这个问题进行更一般的修复,而不是对问题字符串进行硬编码,请考虑检查所找到的字符串是否在替换的字符串中,这将意味着问题发生。这意味着您需要在文档上运行第二个替换,以查找在替换上运行替换的结果


简单地说,您可以运行另一个替换来修复您造成的问题:

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

如果你在对这个问题进行更一般的修复,而不是对问题字符串进行硬编码,请考虑检查所找到的字符串是否在替换的字符串中,这将意味着问题发生。这意味着您需要在文档上运行第二个替换,以查找在替换上运行替换的结果


你可能对我如何解决这个问题感兴趣。 起初,我使用的是NPOI,但它把文档弄得一团糟,所以我发现DOCX文件只是一个带有XML的ZIP归档文件

用法:

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, "{{", "}}");
}
var vars=Dictionary()
{
{“测试标签”,“测试标签值”}
}
使用(var doci=new DociFlow.Lib.Word.SeekAndReplace())
{
//test.docx包含带有标记“{{testtag}}”的文本,它将被替换为“test tag value”
doci.Open(“test.docx”);
doci.findandplace(vars,“{{,“}”);
}

您可能对我如何解决这个问题感兴趣。 起初,我使用的是NPOI,但它把文档弄得一团糟,所以我发现DOCX文件只是一个带有XML的ZIP归档文件

用法:

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, "{{", "}}");
}
var vars=Dictionary()
{
{“测试标签”,“测试标签值”}
}
使用(var doci=new DociFlow.Lib.Word.SeekAndReplace())
{
//test.docx包含带有标记“{{testtag}}”的文本,它将被替换为“test tag value”
doci.Open(“test.docx”);
doci.findandplace(vars,“{{,“}”);
}

你能告诉我什么是正则表达式吗?当然,给我一分钟。@mnu nasir更新了我的答案。:)@mnu nasir如果您有正在使用的脚本(覆盖太多的脚本),我可以给您一些提示。:)谢谢我会让你知道你能告诉我什么是正则表达式吗?当然,给我一分钟。@mnu nasir更新了我的答案。:)@mnu nasir如果您有正在使用的脚本(覆盖太多的脚本),我可以给您一些提示。:)谢谢我会让你知道的