說我有以下字符串:排除分隔符,在MS Word中搜索
"Hello how are you."
由於MS Word允許對正則表達式,我可以使用"*"
找到完整的字符串。但是如果我想排除分隔符(引號)呢?恐怕MS Word不支持解釋爲here的兩種方法之一。我的問題是:有沒有辦法在一個搜索查詢中執行此操作? 在此先感謝。
說我有以下字符串:排除分隔符,在MS Word中搜索
"Hello how are you."
由於MS Word允許對正則表達式,我可以使用"*"
找到完整的字符串。但是如果我想排除分隔符(引號)呢?恐怕MS Word不支持解釋爲here的兩種方法之一。我的問題是:有沒有辦法在一個搜索查詢中執行此操作? 在此先感謝。
有不同的方法來實現你想要的。下面是使用正則表達式在VBA Word中查找文本的一種方法,無需稀釋劑。比方說,你在Word文檔以下文本(不要複製它從這裏作爲網站扭曲了雙引號粘貼。見截圖)
這是一個示例
「這是另一個樣」
「我叫醒你走之前去」,「世界大戰」
代碼使用正則表達式的兩個引號之間返回文本如下
Sub FindText()
Dim regEx, Match, Matches
Set regEx = New RegExp
regEx.Pattern = "([^「]*)(?=\」)"
regEx.IgnoreCase = False
regEx.Global = True
Set Matches = regEx.Execute(ActiveDocument.Range.Text)
For Each Match In Matches
Debug.Print Match.Value
Next
End Sub
,如果你想說找到"Wake me up before you go go"
沒有引號,那麼你可以使用這個以及
Sub FindText()
Dim regEx, Match, Matches
Dim searchText As String
searchText = "Wake me up before you go go"
Set regEx = New RegExp
regEx.Pattern = "([^「]*)(?=\」)"
regEx.IgnoreCase = False
regEx.Global = True
Set Matches = regEx.Execute(ActiveDocument.Range.Text)
For Each Match In Matches
If Trim(Match.Value) = (searchText) Then
Debug.Print "Found"
End If
Next
End Sub
注意:該網站扭曲了實際的雙引號,所以我張貼屏幕截圖。
隨訪
對於您發佈的示例文件,使用此代碼
Sub FindText()
Dim regEx, Match, Matches
Set regEx = New RegExp
regEx.Pattern = """([^""]*)"""
regEx.IgnoreCase = False
regEx.Global = True
Set Matches = regEx.Execute(ActiveDocument.Range.Text)
For Each Match In Matches
Debug.Print Match.SubMatches(0)
Next
End Sub
示例文件可以從這裏下載。請注意,此鏈接將在7天內有效。
HTH
希德
你錯了。 Word支持一些通配符,?
代表一個字符,*
代表一系列字符。
這不是一個正則表達式
意味着沒有回顧後,沒有超前
好吧,對不起,我把它稱爲'正則表達式'。我知道Word支持通配符(因此我使用'「*」')。這留下了問題:是否有可能實現我想要的MS Word? – Daan 2012-03-14 11:57:28
雖然永遠不會有你想要的一切在MS-Word中,例如就像你想要找到別的東西一樣,但是隻想選擇其中的一部分,總是有可以編程來完成任務的宏。
將以下VBA代碼添加到您的文檔。您可以在工具欄上添加一個自定義按鈕來調用它。
Sub FindSpecial()
FindSpecialA
End Sub
Private Sub FindSpecialA(Optional text As String)
Dim ToFind As String
ToFind = InputBox("Enter the text you want to find in double-quotes (without double-quotes):" & vbCrLf & vbCrLf & "(Enter * to match anything within double-quotes)", "Find", text)
If ToFind = "" Then Exit Sub
Selection.Find.ClearFormatting
With Selection.Find
.text = """" & ToFind & """"
.Replacement.text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
If ToFind = "*" Then
.text = "[「""]*[」""]"
.MatchWildcards = True
End If
End With
Selection.Find.Execute
If Selection.Find.Found Then
Selection.MoveStart unit:=wdCharacter, Count:=1
Selection.MoveEnd unit:=wdCharacter, Count:=-1
FindSpecialA ToFind
Else
MsgBox "Not found!"
End If
End Sub
編輯:
更新的代碼來處理通配符*匹配。
MS Word中支持正則式的羣體與他們的「使用通配符搜索」選項中的某些版本中,這意味着,如果你可以在兩個引號之間創建一個搜索表達式 - 適用於我的那個是"[email protected]"
- 您可以將其更改爲"([email protected])"
並輸入\1
替換文本。這將取代只與匹配括號內表達式的文本找到的文本,擺脫引號。 (MS Word的[email protected]
相當於.*
(非貪婪)在共同的正則表達式。)
這適用於我在Word 2008 for Mac,但我沒有指導哪些版本的Office支持此語法。
當心!在此搜索表單中,Word不會將鍵盤上的直引號與它插入的捲曲引號等同起來,以便看起來很漂亮。您需要關閉此文檔的「智能引語」,或者通過剪切並粘貼文檔中的開頭和結尾引號字符來構建搜索短語。
我已經運用顏色(格式<單擊查找內容時搜索對話框中的字體)來解決這類問題。使用分隔符執行搜索所有內容(帶有通配符的「*」),並使用非黑色替換爲藍色。從藍色到黑色搜索並替換分隔符(本例中爲引號)。用藍色對內容進行更改。全選並變爲黑色。如果這經常出現,我會建議第一步的工具欄上的宏(藍色,取消藍色分隔符)和第二步(全部改爲黑色)。
+1更接近要求。 :) – 2012-03-14 14:16:11
感謝您的詳盡答案。我已經能夠將其添加到項目中並進行編譯。但是,當我運行它時,似乎沒有任何事情發生。你能給我幾個關於如何運行的步驟嗎?謝謝。 – Daan 2012-03-15 00:12:33
@ KeyMs92:告訴我你是如何整合代碼的? – 2012-03-15 03:50:11