我正在嘗試在 Word 2010 中查找以下格式的文字:ABC.DEF.XYZ。這本質上是使用 Java 語法查找程式碼引用,並將其寫入 Word 文件中。請注意,3 元素引用只是一個範例。實際參考最少有 2 個元素,最多有 5 個元素。
我嘗試了多種通配符(和非通配符)組合來使其發揮作用,但沒有運氣。以下是我嘗試過的一些方法:
<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
注意,這實際上可以找到 2 元素引用。在較大的字串中尋找模式時(例如,符合 3 元素引用的元素 2 和 3),它是偶然的。<([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
給予錯誤 - 無效模式<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
運行時間太長,以至於 Word 掛起超過 15 分鐘,並且找不到任何匹配項(文檔大約有 150 頁文本,所以可能它無法處理)<([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$C
或ABCD
([\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方法,我認為您將需要多次運行文本,每次使用以下搜尋通配符之一:
[!.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]@)[.][!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]([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]@).([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]@)。 ([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]@).([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]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]
每組的第一個將找到一個版本號,後面跟著一個非句點或字母。第二個將找到以句點(例如句子結尾)結尾的 ver#。
這些通配符將尋找從版本 # 之前的字元到版本 # 之後的 2 個字元的選擇。但是,子組將被提取並分配好。
使用帶有通配符的 word 查找方法有兩個問題。一是單字無法指定 0 個或多個特定字元或相同字元組。這消除了一些可由正規表示式函數處理的簡單匹配方法。
第二個問題是 ver # 中的句點看起來像是單字的結尾,因此尖括號對於在通配符中使用句點來說是多餘的。尖括號也不應該在外部使用,因為當在具有大量子組的字串中找到具有少量子組的版本 # 時,它會導致錯誤匹配。
我還需要補充一點,如果您執行“查找”,然後執行“替換”,您應該更改“查找”執行返回的選擇,使其結尾等於文檔的結尾(希望您之前已保存此值) 。這是因為如果選擇等於“查找”文本,則替換命令將不會再次找到匹配的選擇。我知道這對於非通配符查找/替換是正確的。安全總比後悔好。