簡體   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