我现在很难找到工作解决方案几个小时。我希望你能帮助我。
我的问题: 在提供特定句子的起始和结束字符串之后,我需要在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
它也没有帮助。我被困在这里:/
感谢您的任何建议!
答案 0 :(得分:0)
Selection.Find
与正则表达式类似,
但在这种情况下,您必须使用真实正则表达式。
模式(在这种特殊情况下)应该是:
People[^.]+apples\.
我写了一个示例宏,其中:
src
变量(由正则表达式搜索)。regEx.Test
)。ret
变量。下面有一个完整的宏。可能你应该把它改成 选择(查找)匹配的文本(而不是消息框)。
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