查找并替换URL和电子邮件地址

时间:2017-06-28 19:46:01

标签: regex vba replace ms-word word-vba

我可以使用正则表达式查找和替换Microsoft Word文档中的IP地址,但是我无法对电子邮件地址和网址执行相同操作。

以下是经过测试的网址和电子邮件地址的正则表达式,因此我知道它们有效。我一直无法让宏使用它们进行查找和替换。

网址:“((https | http)://)?([0-9a-zA-z .-] +)。([0-9a-zA-Z。] {2,6})( [0-9A-ZA-Z .- /] +)“

电子邮件:“[a-zA-Z0-9。] +(\ @)[a-zA-Z] +(。)[a-zA-Z0-9] {2,6}”

Sub Test()
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.MatchWildcards = True


    ' Remove IPs
    With Selection.Find
        .Text = "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"
        .Replacement.Font.ColorIndex = wdRed
        .Replacement.Text = "[IP REMOVED]"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

我使用以下代码测试了我的正则表达式:

Sub Test_Regex()
    Dim objRegExp As Object
    Set objRegExp = CreateObject("vbscript.regexp")
    objRegExp.Global = IsGlobal1
    objRegExp.Pattern = "((https|http)\:\/\/)?([0-9a-zA-z\.\-]+)\.([0-9a-zA-Z\.]{2,6})([0-9a-zA-z\.\-\/]+)?"
    objRegExp.IgnoreCase = Not IsCaseSensitive1
    RegExpReplace = objRegExp.Replace("google.com/asdasd/asda/asda.cssd", "RegexWorks")
    MsgBox (RegExpReplace)
End Sub

@WiktorStribiżew - 我尝试使用基于您最近评论的正则表达式来保留格式,但是当我运行它时它仍然会剥离格式。这个urlPattern正则表达式和你描述的一样吗?

Sub Test()
    Dim urlPattern As String: urlPattern = "((https)\:\/\/)([0-9a-zA-z\.\-]+)\.([0-9a-zA-Z\.]{2,6})([0-9a-zA-z\.\-\/]+)"
    Dim regExp As Object
    Set regExp = CreateObject("vbscript.regexp")

    With regExp
        .Pattern = urlPattern
        .Global = True
        ActiveDocument.Range = regExp.Replace(ActiveDocument.Range, "[REDACTED]")
    End With
End Sub

1 个答案:

答案 0 :(得分:0)

我已经修改了一下并将您的模式转换为Word兼容的占位符模式,因为您需要使用Word搜索/替换而不是正则表达式引擎。

重要提示:

  

在Word中,占位符模式具有本地化部分,这意味着   量词可以用分号而不是逗号分隔,具体取决于   在你的语言环境中。

另请注意,问号并不意味着"可选"在Word中,而不是#34;任何类型的#1; 3#。因此,如果您的网址没有http / s简介,则需要第三种模式。

那就是说,这里应该给你一个良好的开端。请注意我在{}量词中使用分号,如果您的语言环境需要,请替换为逗号。另请注意我没有使用选择:

Dim patterns As Variant
Dim placeholder As Variant

patterns = Array("[a-zA-Z0-9.]{1,}(\@)[a-zA-Z]{1,}.[a-zA-Z0-9]{2,6}", "htt[ps]{1,2}://[0-9a-zA-Z.\-]{1,}[0-9a-zA-Z.\/\-_]{1,}", "[0-9a-zA-Z\-]{3,}.[0-9a-zA-Z.\/\-_]{3,}")
placeholder = Array("[EMAIL REMOVED]", "[URL REMOVED]", "[URL REMOVED]")

For i = 0 To 2
    With ActiveDocument.Content.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .text = patterns(i)
        .Replacement.text = placeholder(i)
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With
Next i