【问题标题】:Marking word as "find and replace" in Microsoft Word with RegEx使用 RegEx 在 Microsoft Word 中将单词标记为“查找和替换”
【发布时间】:2017-01-26 09:50:50
【问题描述】:

我尝试突出显示由 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

【问题讨论】:

    标签: regex vba ms-word


    【解决方案1】:

    实际上,这有几个问题。

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

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

    【讨论】:

    • “所以每个连续的比赛都看一个旧位置” - 是的。这就是为什么我认为每次都需要重新调整。但不要担心
    • “所以每个连续的比赛都看一个旧位置” - 是的。这就是为什么我认为每次都需要重新调整。但不要担心。 “您一次替换所有出现的事件” - 这不是想法。我想在替换之前检查单词。就像在常规文档上查找和替换一样。全部重新编码是没有问题的。如果你有想法,我会接受。
    • 这段代码的思想是:“通过正则表达式模式在文档中查找文本,其中有十个,并用询问是,否,取消逐个更改找到的单词。是 - 替换取决于与其相关的模式。否 - 转到下一个找到的单词。取消 - 退出搜索。"
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多