【问题标题】:MS Word 2016 Macro Regex ReplaceMS Word 2016 宏正则表达式替换
【发布时间】:2019-06-17 08:16:43
【问题描述】:

我正在尝试使用 Regex 编写宏,我的模式是 \(\bTopic \d+\b\),宏应该从所有代码中删除 (Topic 1)(Topic 2)整个文档中的问题,但我的宏代码不起作用。感谢您的帮助。

输入:

问题编号:1(主题 1)

问题编号:15(主题 2)

结果应该是

问题编号:1

问题编号:15

宏代码

Sub RemoveQuestionTopic()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\(\bTopic \d+\b\)"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = True
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

【问题讨论】:

    标签: regex vba ms-word office365


    【解决方案1】:

    正则表达式语法与普通正则表达式不同。如果你用这个替换你的表达式:

    .Text = "\(Topic ([0-9]@>)\)"
    

    你会得到预期的结果。在这种情况下无需使用 VBScript.Regexp。

    【讨论】:

    • 肯定比我的解决方案更好。 +1。您能否提供一些链接以供参考,我可以从中了解更多关于单词正则表达式语法的信息?
    • superuser.com/questions/86397/wildcards-in-word 包含很多信息和很好的链接
    • 感谢您的帮助,它就像一个魅力。因为这是@Gurman 也同意的更好的解决方案。我将此标记为正确答案。再次感谢
    • 您可以将其进一步简化为:.Text = "(Topic [0-9]@)"。有关 Word 中 通配符 的更多信息,请参阅:wordmvp.com/FAQs/General/UsingWildcards.htm 而且,如果“主题”后面的数字只是一个数字,您甚至不需要 通配符 -只是(主题^#)。
    • 论坛吞下反斜杠 - .Text = "\(Topic [0-9]@\)"
    【解决方案2】:

    查找功能仅对正则表达式提供非常有限的支持。您需要使用VBScript.Regexp,如下所示。

    试试这个代码:

    Sub RemoveQuestionTopic()
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
    
        strReplacementText = "++__++"
        ActiveDocument.Select
        Set objReg = CreateObject("VBScript.Regexp")
        objReg.Pattern = "\s*\(Topic\s*\d+\)"
        objReg.Global = True
        Selection.Text = objReg.Replace(Selection.Text, strReplacementText)
    
        With Selection.Find
            .MatchWildcards = True
            .Text = strReplacementText
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = True
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub
    

    Regex Demo

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多