c# - 使用 OpenXML 和 Regex 在 Word Docx 中查找和替换撇号 ( ' ) 时出现问题

标签 c# regex replace openxml

Word 似乎使用与 Visual Studio 不同的撇号字符,并且它导致使用正则表达式出现问题。

我正在尝试使用 OpenXML 在 C# 中编辑一些 Word 文档。我基本上用公司名称替换​​ [[COMPANY]]。这个过程非常顺利,直到我遇到了名称以 s 结尾的公司的极端情况。我最终遇到了问题 s,有时它会创建 s。

示例: 公司名称: 席梦思 文件中的文本:[[COMPANY]] 的业务是汽车。 结果:西蒙斯的生意是汽车。

这是不正确的英语。

我应该能够使用基本的查找和替换,就像我对 [[COMPANY]] 所做的那样,但它不起作用。

            Regex apostropheReplace = new Regex("s\\'s");
            docText = apostropheReplace.Replace(docText, "s\'"); 

这不是。似乎 Word 使用的字符和撇号(') 与我在 Visual Studio 中使用键盘上的按键时创建的标准字符不同。如果我使用键盘编写查找和替换,它将不起作用,但如果我从 Word 复制并粘贴撇号,它就会起作用。

            Regex apostrophyReplace = new Regex("s\\’s");
            docText = apostrophyReplace.Replace(docText, "s\'"); 

请注意第二个正则表达式中的不同字符。我很困惑为什么会这样,也想知道这是否是这样做的正确方法。我尝试了“'”,但这不起作用。我只是想知道使用从 Word 复制的字符是否是执行此操作的正确方法,并且有没有办法做到这一点,以便两个字符都可以工作,这样我就不会遇到可能使用不同的文档创建的问题程序。

最佳答案

发生这种情况的原因是因为他们是不同的角色。

Word 实际上会在您键入某些标点符号后对其进行更改,以便为它们提供正确的倾斜度或改进显示效果。

我之前遇到过同样的问题,我使用它作为正则表达式:[\u2018\u2019\u201A\u201b\u2032']

因此,基本上将您的代码修改为:

Regex apostropheReplace = new Regex("s\\[\u2018\u2019\u201A\u201b\u2032']s");
docText = apostropheReplace.Replace(docText, "s\'")

我发现这些是五种最常见的单引号和撇号类型。

如果您遇到双引号相同的问题,可以使用以下方法:[\u201C\u201D\u201E\u201F\u2033\u2036\"]

关于c# - 使用 OpenXML 和 Regex 在 Word Docx 中查找和替换撇号 ( ' ) 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58615071/

相关文章:

c# - Where 条件中的字符串列表

c# - 替换 1 到 0 或 1 关系的端点

javascript - 在查找和替换中使用正则表达式提取除模式/字符串之外的所有内容

regex - 在 SED 中用正则表达式匹配和替换 ![foo](/bar/)

python - 替换换行符不起作用

java - 使用 Maven Replace Plugin 替换 Target/generated-sources 中生成的 Java 文件上的短语

c# - 安装 Visual Studio 2017 RC 会破坏 dotnet core 1.0.1?

c# - c# 可以向包含法语字符的地址发送电子邮件吗?

JavaScript 在字符串的 2 个字符后添加空格但忽略换行符

regex - 在两个字符串Powershell之间替换文本