使用MS Word中的搜索排除分隔符

时间:2012-03-14 09:22:06

标签: regex ms-word

说我有以下字符串:

"Hello how are you."

由于MS Word允许正则表达式,我可以使用"*"来查找完整的字符串。但是,如果我想排除分隔符(引号)怎么办?我担心MS Word不支持here解释的两种方法中的任何一种。我的问题是:在一个搜索查询中有没有办法做到这一点? 提前谢谢。

5 个答案:

答案 0 :(得分:1)

有不同的方法可以达到你想要的效果。这是在VBA Word中查找文本的一种方法,没有使用Regex 的稀释器。假设您在Word文档中有以下文本(不要从此处复制并粘贴它,因为网站会扭曲双引号。请参阅屏幕截图)

  
    
      
        

这是一个样本

                 

“这是另一个样本”

                 

“在你离开之前叫醒我”

                 

“世界大战”

      
    
  

使用两个引号之间的Regex返回文本的代码如下

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

西特

答案 1 :(得分:0)

你错了。 Word确实支持一些通配符,?表示单个字符,*表示一系列字符。

这不是正则表达式

意味着没有外观,也没有前瞻

答案 2 :(得分: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

修改

更新了处理通配符*匹配的代码。

答案 3 :(得分:0)

某些版本的MS Word支持使用“使用通配符搜索”选项的正则表达式组,这意味着如果您可以在两个引号之间创建搜索表达式 - 对我有用的是"?@" - 您可以将其更改为"(?@)"并输入\1作为替换文字。这将替换仅使用与括号之间的表达式匹配的文本找到的文本,删除引号。 (MS Word的?@相当于普通正则表达式中的.*(非贪婪)。)

这适用于Word 2008 for Mac,但我没有指导哪些版本的Office支持此语法。

小心!在此搜索表单中,Word不会将键盘上的直引号与它插入的引号相等,以便看起来很漂亮。您需要关闭此文档的“智能引号”,或者通过剪切和粘贴文档中的开始和结束引号字符来构建搜索短语。

答案 4 :(得分:0)

我很幸运使用了颜色(在点击查找内容时,在搜索对话框中显示格式&lt;字体)来解决这样的问题。使用分隔符执行搜索所有内容(在此示例中检查通配符为“*”)并使用非蓝色替换为蓝色。搜索和替换分隔符(在本例中为引号)颜色从蓝色到黑色。以蓝色对内容进行更改。全选并更改为黑色。如果经常出现这种情况,我建议在第一步的工具栏上使用宏(蓝色,取蓝色分隔符)和第二步(将全部更改为黑色)。