说我有以下字符串:
"Hello how are you."
由于MS Word允许正则表达式,我可以使用"*"
来查找完整的字符串。但是,如果我想排除分隔符(引号)怎么办?我担心MS Word不支持here解释的两种方法中的任何一种。我的问题是:在一个搜索查询中有没有办法做到这一点?
提前谢谢。
答案 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
注意:网站扭曲了实际的双重报价,因此我发布了截图。
<强>后续强>
对于您发布的示例文件,请使用此代码
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
西特
答案 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;字体)来解决这样的问题。使用分隔符执行搜索所有内容(在此示例中检查通配符为“*”)并使用非蓝色替换为蓝色。搜索和替换分隔符(在本例中为引号)颜色从蓝色到黑色。以蓝色对内容进行更改。全选并更改为黑色。如果经常出现这种情况,我建议在第一步的工具栏上使用宏(蓝色,取蓝色分隔符)和第二步(将全部更改为黑色)。