2012-03-14 53 views
2

說我有以下字符串:排除分隔符,在MS Word中搜索

"Hello how are you." 

由於MS Word允許對正則表達式,我可以使用"*"找到完整的字符串。但是如果我想排除分隔符(引號)呢?恐怕MS Word不支持解釋爲here的兩種方法之一。我的問題是:有沒有辦法在一個搜索查詢中執行此操作? 在此先感謝。

回答

1

有不同的方法來實現你想要的。下面是使用正則表達式在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 

注意:該網站扭曲了實際的雙引號,所以我張貼屏幕截圖。

enter image description here

隨訪

對於您發佈的示例文件,使用此代碼

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天內有效。

Sample File

HTH

希德

+0

+1更接近要求。 :) – 2012-03-14 14:16:11

+0

感謝您的詳盡答案。我已經能夠將其添加到項目中並進行編譯。但是,當我運行它時,似乎沒有任何事情發生。你能給我幾個關於如何運行的步驟嗎?謝謝。 – Daan 2012-03-15 00:12:33

+0

@ KeyMs92:告訴我你是如何整合代碼的? – 2012-03-15 03:50:11

0

你錯了。 Word支持一些通配符,?代表一個字符,*代表一系列字符。

這不是一個正則表達式

意味着沒有回顧後,沒有超前

+0

好吧,對不起,我把它稱爲'正則表達式'。我知道Word支持通配符(因此我使用'「*」')。這留下了問題:是否有可能實現我想要的MS Word? – Daan 2012-03-14 11:57:28

0

雖然永遠不會有你想要的一切在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 

編輯:

更新的代碼來處理通配符*匹配。

0

MS Word中支持正則式的羣體與他們的「使用通配符搜索」選項中的某些版本中,這意味着,如果你可以在兩個引號之間創建一個搜索表達式 - 適用於我的那個是"[email protected]" - 您可以將其更改爲"([email protected])"並輸入\1替換文本。這將取代只與匹配括號內表達式的文本找到的文本,擺脫引號。 (MS Word的[email protected]相當於.*(非貪婪)在共同的正則表達式。)

這適用於我在Word 2008 for Mac,但我沒有指導哪些版本的Office支持此語法。

當心!在此搜索表單中,Word不會將鍵盤上的直引號與它插入的捲曲引號等同起來,以便看起來很漂亮。您需要關閉此文檔的「智能引語」,或者通過剪切並粘貼文檔中的開頭和結尾引號字符來構建搜索短語。

+0

我認爲它的工作原理與您所描述的完全相同。但是,最後它只會刪除引號。它不會過濾掉任何其他不需要的內容。我想選擇/提取_only_引號內的內容。 – Daan 2012-03-15 15:15:45

+0

如果您嘗試搜索並刪除關閉引號和開始引號之間的所有文本,會發生什麼情況? – octern 2012-03-15 16:38:02

0

我已經運用顏色(格式<單擊查找內容時搜索對話框中的字體)來解決這類問題。使用分隔符執行搜索所有內容(帶有通配符的「*」),並使用非黑色替換爲藍色。從藍色到黑色搜索並替換分隔符(本例中爲引號)。用藍色對內容進行更改。全選並變爲黑色。如果這經常出現,我會建議第一步的工具欄上的宏(藍色,取消藍色分隔符)和第二步(全部改爲黑色)。