使用RegEx在Microsoft Word中将单词标记为“查找和替换”

时间:2017-01-26 09:50:50

标签: regex vba ms-word word-vba

我尝试突出显示RegEx找到的单词,以及是否有权将其替换为相应的替代品。

只有在未替换时,代码才能正常工作。

可能每次都要重新排列???

Sub Replace()
Dim regExp As Object
Set regExp = CreateObject("vbscript.regexp")
Dim arr As Variant
Dim arrzam As Variant
Dim i As Long
Dim choice As Integer
Dim Document As Word.Range
Set Document = ActiveDocument.Content

On Error Resume Next
'EGN
'IBAN

arr = VBA.Array("((EGN(:{0,1})){0,1})[0-9]{10}", _
"[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}")
arrzam = VBA.Array("[****]", _
"[IBAN]")
With regExp
    For i = 0 To UBound(arr)
        .Pattern = arr(i)
        .Global = True
        For Each Match In regExp.Execute(Document)            
            ActiveDocument.Range(Match.FirstIndex, Match.FirstIndex +     Match.Length).Duplicate.Select
            choice = MsgBox("Replace " & Chr(34) & Match.Value & Chr(34) & " with " & Chr(34) & arrzam(i) & Chr(34) & "?", _
                vbYesNoCancel + vbDefaultButton1, "Replace")
        If choice = vbYes Then          
          Document = .Replace(Document, arrzam(i))
        ElseIf choice = vbCancel Then          
          Next
        End If
        Next
    Next
End With

End Sub

1 个答案:

答案 0 :(得分:0)

实际上,这有几个问题。

首先,每个匹配中的每个匹配是静态的,在第一个循环时确定。您正在同时更改文档,因此每次连续匹配都会查看旧位置。

其次,您一次替换所有出现的事件,因此无需循环遍历它们。这似乎是一行,一次替换可以做同样的事情。

相关问题