繁体   English   中英

使用 OpenXML 和 Regex 在 Word Docx 中查找和替换撇号(')的问题

[英]Issue with find and replace apostrophe( ' ) in a Word Docx using OpenXML and Regex

Word 似乎使用与 Visual Studio 不同的撇号字符,这导致使用 Regex 时出现问题。

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

示例:公司名称:Simmons 文档中的文本:[[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 实际上会在您键入某些标点符号后更改它们,以便为它们提供正确的倾向或改进演示文稿。

我之前遇到过同样的问题,我将其用作正则表达式: [\‘\’\‚\‛\′']

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

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

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

如果您遇到与双引号相同的问题,您可以使用以下方法: [\“\”\„\‟\″\‶\\"]

回答问题:

有没有办法让两个角色都能工作?

如果您希望一个 Regex 能够处理这两种情况,这可能是一个简单易读的解决方案:

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

这有一个额外的好处,即您试图涵盖两种撇号情况的其他开发人员可以理解。 这个好处在你问题的另一部分得到:

如果使用从 Word 复制的字符是正确的方法吗?

这取决于你所说的“适当”是什么意思。 如果您的意思是“其他开发人员最容易理解”,我会说是的,因为只需进行最少的查找即可准确了解您的 Regex 正在寻找什么。 如果您的意思是“最高性能”,那么这个简单的 Regex 搜索应该不是问题(可以在此处找到一些不错的 Regex 性能提示)。

如果您的意思是“最通用/最健壮的单引号正则表达式”,那么正如@Leonardo-Seccia 指出的那样,还有其他字符编码可能会导致麻烦。 此处列出一些常见的 Microsoft Word 解决方案。)这样的解决方案可能如下所示:

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

但是您当然可以根据需要添加其他字符编码。 可以在此处找到更完整的字符编码列表 - 要将它们添加到上述 Regex,只需将“U+”更改为“u”并将其添加到另一个“\\”字符之后的列表中。 例如,要将“素数”符号(' 或 U+2032)添加到上面的列表中,请将 RegEx 字符串从

Regex("s\\['\u2018\u2019\u201A\u201b]s")

Regex("s\\['\u2018\u2019\u201A\u201b\u2032]s")

最终,您将根据您的用例判断哪些字符编码最“适合”包含在您的 Regex 中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM