Word 2010 通配符搜尋 - 尋找 ABC.DEF.XYZ 格式的文本

Word 2010 通配符搜尋 - 尋找 ABC.DEF.XYZ 格式的文本

我正在嘗試在 Word 2010 中查找以下格式的文字:ABC.DEF.XYZ。這本質上是使用 Java 語法查找程式碼引用,並將其寫入 Word 文件中。請注意,3 元素引用只是一個範例。實際參考最少有 2 個元素,最多有 5 個元素。

我嘗試了多種通配符(和非通配符)組合來使其發揮作用,但沒有運氣。以下是我嘗試過的一些方法:

  1. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    注意,這實際上可以找到 2 元素引用。在較大的字串中尋找模式時(例如,符合 3 元素引用的元素 2 和 3),它是偶然的。

  2. <([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
    給予錯誤 - 無效模式

  3. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    運行時間太長,以至於 Word 掛起超過 15 分鐘,並且找不到任何匹配項(文檔大約有 150 頁文本,所以可能它無法處理)

  4. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    當我嘗試這個時,Word 實際上崩潰了。

理想情況下,我認為 #2 的工作版本是理想的 - 但是,我不知道如何使該模式有效。

如果這是不可能的,我可以只使用 #1 並希望它捕獲所有內容(不確定為什麼它匹配某些字串而不匹配其他字串)。

任何幫助是極大的讚賞。

答案1

您可以使用Word 的VBA RegEx 引擎來取代Word 的通配符搜尋。


好的,任務是找到具有以下模式的所有字串

###.###  
###.###.###
###.###.###.###
###.###.###.###.###

我能創造的最好的模式是

([\w\d]{3}\.){1,4}[\w\d]{3}

返回以下標有黃色的命中

在此輸入影像描述

圖案解釋

  • \w匹配 Az 中的單一字元。它不區分大小寫
  • \d匹配數字 0-9
  • [\w\d]{3}匹配 3 個字元或數字,例如ABC, abc, 123, Ab1- 但不匹配A$CABCD
  • ([\w\d]{3}\.){1,4}配對 1、2、3 或 4 個帶有以下點的群組\.。最後一組[\w\d]{3}不要求以下幾點

VBA宏

ALT+F11開啟 VBA 編輯器。將程式碼貼到任意位置並執行F5

Sub RegExMark()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")

    RegEx.Global = True
    RegEx.Pattern = "([\w\d]{3}\.){1,4}[\w\d]{3}"

    Set Matches = RegEx.Execute(ActiveDocument.Range)
    For Each hit In Matches
       Debug.Print hit
       ActiveDocument.Range(hit.FirstIndex, hit.FirstIndex + hit.Length). _
         HighlightColorIndex = wdYellow
    Next hit

End Sub

警告

正如範例圖像中紅色標記的那樣,當前模式存在缺陷,並且還匹配太長的字串子字串。我玩了一下\b[^\.]\s沒有一個適用於所有情況。也許其他用戶可以找到有效的解決方案?

使用資源

答案2

我建議將文字複製到 Notepad++,然後使用 RegEx 選項進行更改。

我知道這聽起來很痛苦,但是一旦習慣了,您就可以非常快速地在程式之間切換。

RegEx 是 Notepad++ 中「尋找/取代」視窗中的選項。其他編輯器也有相同的功能。

伊凡

答案3

如果您確實需要在word中使用範圍物件的find方法,我認為您將需要多次運行文本,每次使用以下搜尋通配符之一:

  1. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  2. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  3. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[ !.a-z0-9A-Z]

  4. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[ .][!a-z0-9A-Z]

  5. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)。 ([a-z0-9A-Z]@) [!.a-z0-9A-Z]

  6. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)。 ([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  7. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)。 ([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  8. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)。 ([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

每組的第一個將找到一個版本號,後面跟著一個非句點或字母。第二個將找到以句點(例如句子結尾)結尾的 ver#。

這些通配符將尋找從版本 # 之前的字元到版本 # 之後的 2 個字元的選擇。但是,子組將被提取並分配好。

使用帶有通配符的 word 查找方法有兩個問題。一是單字無法指定 0 個或多個特定字元或相同字元組。這消除了一些可由正規表示式函數處理的簡單匹配方法。

第二個問題是 ver # 中的句點看起來像是單字的結尾,因此尖括號對於在通配符中使用句點來說是多餘的。尖括號也不應該在外部使用,因為當在具有大量子組的字串中找到具有少量子組的版本 # 時,它會導致錯誤匹配。

我還需要補充一點,如果您執行“查找”,然後執行“替換”,您應該更改“查找”執行返回的選擇,使其結尾等於文檔的結尾(希望您之前已保存此值) 。這是因為如果選擇等於“查找”文本,則替換命令將不會再次找到匹配的選擇。我知道這對於非通配符查找/替換是正確的。安全總比後悔好。

相關內容