如何在 Word 2010 中建立正規表示式查找/替換

如何在 Word 2010 中建立正規表示式查找/替換

我對基本的 javascript 正規表示式有一些有限的經驗,我用它來操作一些使用者資料條目。但現在,有人問我有關操作 MS Word 2010 文件的問題。

具體來說,我的用戶會得到一長串數據數字列表,如下所示:

1. blah blah 'car' blah blah
2. blah blah 'truck' blah blah
3. blah blah 'boat' blah blah

這是一個未格式化的純 Word 文件。他們希望在每個數字後面有一個格式化的標題,基於單引號中的項目,ala:

1. CAR: blah blah 'car' blah blah
2. TRUCK: blah blah 'truck' blah blah
3. BOAT: blah blah 'boat' blah blah

他們目前有轉錄員手動進行這些更改(有時會出現錯誤)。使用 javascript/jQuery,我可以編寫一些程式碼來獲取這些數據,搜尋引號中的單詞,找到匹配之前最接近的數字,並在句點之後插入它的全大寫版本。

但是,我對Word 中的類似功能沒有太多經驗。這可以透過巨集或某種類型的腳本來完成嗎?是否可以編寫我的 javascript/jQuery 程式碼並讓它以某種方式在 Word 實例中運行?

感謝您的指導!

答案1

是的! Microsoft Office VBA 本機支援正規表示式搜尋。您必須在 VBA 編輯器中為要在其中放置 Regex 程式碼的每個 、 等檔案.docm新增「Microsoft VBScript Regular Expressions 5.5」作為參考:.xlsm

VBA 剪輯

此正規表示式模組的大部分物件模型都可以在 MSDN 上找到這裡。似乎缺少的一件事是MultiLine設定。

您可以如下使用它:

  • 實例化一個新的正規表示式對象Dim rx as New RegExp
  • 根據需要設置rx.Globalrx.MultiLine和標誌rx.IgnoreCase
  • 透過將適當的模式字串分配給來定義模式rx.Pattern
  • 如果您想知道某些內容是否與正規表示式匹配,請使用rx.Test(str),它會適當地返回TrueorFalse
  • 呼叫rx.Execute(str)傳回一個對象,其行為類似於由零個或多個物件MatchCollection組成的從零開始的一維數組Match
  • Match物件公開FirstIndexLengthValueSubMatches屬性。
    • FirstIndexstr是找到匹配項的位置的第一個字元的從零開始的索引
    • Length是匹配部分的長度str
    • Value是匹配的字串結果
    • SubMatches是一個從零開始的數組子匹配組在整體比賽中
      • 不幸的是,Office VBA 正規表示式不支援命名組(例如 Python),因此可能需要進行一些嘗試才能將群組索引與您感興趣的模式片段相匹配

我不相信有辦法進行sed-style 就地替換操作 - 這是一種僅限搜尋的功能。但是,使用周圍的 VBA 來按照您的意願操作結果是很容易的。

答案2

如果它只是Word 文件中的純文本,並且不是很大,並且您熟悉jquery,您可以創建一個簡單的網站,他們可以將Word 文件複製/粘貼到其中,然後您進行必要的更改,然後讓他們下載轉換後的Word記錄或輸出所需的文字。這實際上取決於您具體情況的更多細節來判斷這是否是一個好的解決方案。

該巨集也可能可以完成,但可能很難部署給用戶,具體取決於您有多少用戶。

答案3

如果您不精通 VBA 或 Python 腳本編寫,並且 @hBy2Py 答案想法不適合您的能力,請嘗試使用 GoogleSheets/Excel 實現您的演算法:

  1. upload=將未格式化的純 word=txt 文件匯入到 G'Sheet 中。假設您的清單位於 A 欄位。
  2. 在 B 列中,使用 REGEXEXTRACT 為引號中的單字編寫所有列的巢狀公式,並將該單字設為大寫=ARRAYFORMULA(UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)")))
  3. ……或使單獨的 C 列將該單字變為大寫:=UPPER(B:B)
  4. 在 C 列(或 D 列)中將新清單與大寫單字結合(有多種方法可以做到這一點,例如透過分割/連接或只是=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&B:B&": "))

總而言之:

=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)"))&": "))

其他解決方法可以使用此處描述的解決方案:使用通配符/正規表示式在 Notepad++ 中尋找和替換

相關內容