VBA Word通配符 - 查找最短的字符集

时间:2017-08-01 15:52:53

标签: regex vba ms-word word-vba wildcard

我现在很难找到工作解决方案几个小时。我希望你能帮助我。

我的问题: 在提供特定句子的起始和结束字符串之后,我需要在Word中查找并选择整个句子。 例如,当我的起始字符串是“People”并且结束字符串是“apples”时。我希望Word选择整个“人们喜欢红苹果”。在我的文件中的句子。 (如果存在这样的句子)

为此,我准备了一个像我想要的那样几乎的宏。唯一的问题是它没有选择尽可能小的字符集(我希望它能做到)。为了说清楚,我们假设我的文档中有这个文本:People like smoking. People like red apples.

现在,当我将开始和结束字符串分别作为“People”和“apples。”提供时,它选择 all 文本,其中包含上述2个句子。这是我的问题:我希望它选择第二句(People like red apples.),而不是两者,即使它们以相同的单词开头。所以,基本上,我总是想选择最短的字符集(在这种情况下只是最后一句)。

以下是VBA中宏的一部分:

`text_str = startStr & "*" & endStr

With Application.Selection.Find
    .ClearFormatting 
        .Forward = True         
        .Wrap = wdFindContinue  
        .Text = text_str 
        .MatchWildcards = True
        .MatchCase = True       
        .Execute
End With

我知道问题出在通配符(或非常有限的正则表达式集)上,所以我也尝试过这样的搜索字符串:

text_str = "(" & startStr & "*){1}" & endStr

它也没有帮助。我被困在这里:/

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

Selection.Find与正则表达式类似, 但在这种情况下,您必须使用真实正则表达式。

模式(在这种特殊情况下)应该是:

People[^.]+apples\.

我写了一个示例宏,其中:

  1. 选择文档中的整个文本并将其分配给src 变量(由正则表达式搜索)。
  2. 将光标设置在文档的开头。
  3. 检查模式是否匹配(regEx.Test)。
  4. 执行正则表达式。
  5. 将匹配的字符串分配给ret变量。
  6. 在消息框中显示。
  7. 下面有一个完整的宏。可能你应该把它改成 选择(查找)匹配的文本(而不是消息框)。

    Sub Re()
      Dim startStr As String: startStr = "People"
      Dim endStr As String: endStr = "apples"
      Dim pattern As String: pattern = startStr & "[^.]+" & endStr & "\."
      Dim regEx As New RegExp
      Dim src As String
      Dim ret As String
      Dim colMatches As MatchCollection
    
      ActiveDocument.Range.Select
      src = ActiveDocument.Range.Text
      Selection.StartOf
      regEx.pattern = pattern
      If (regEx.Test(src)) Then
        Set colMatches = regEx.Execute(src)
        ret = "Match: " & colMatches(0).Value
      Else
        ret = "Matching Failed"
      End If
      MsgBox ret, vbOKOnly, "Result"
    End Sub