【问题标题】:Find and replace URLs and Email addresses查找和替换 URL 和电子邮件地址
【发布时间】:2017-12-02 08:09:25
【问题描述】:

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

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

网址:“((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

@Wiktor Stribiż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

【问题讨论】:

  • 它使用什么样的正则表达式引擎?
  • 我不认为你需要这些逃逸。尝试使用 C 风格的字符串 "((https|http)://)?([0-9a-zA-z.-]+)\\.([0-9a-zA-Z.]{2,6})([0-9a-zA-Z./-]+)?" 我在课堂上将 A-z 更正为 A-Z
  • 您很困惑,因为Selection.Find 使用 wildcard 表达式,并且在 VBA 代码中,您使用了 Microsoft VBScript Regular Expressions 5.5 regular 表达式。通配符表达式没有 零个或多个 / 零个或一个 量词。它们不能匹配空字符串。
  • 如果我明白你在问什么,那就是 VBA
  • @sln -- 使用 C-Style 字符串,..它给了我以下错误-并指向 Selection.find.execute 行:运行时错误'5560':查找内容text 包含无效的模式匹配表达式。

标签: regex vba replace ms-word


【解决方案1】:

我稍作修改并将您的模式转换为与 Word 兼容的占位符模式,因为您需要使用 Word 搜索/替换而不是正则表达式引擎来执行此操作。

重要提示:

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

另请注意,问号在 Word 中并不表示“可选”,而是表示“任何类型的 1 个字符”。因此,如果您的 URL 没有 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

【讨论】:

  • 谢谢!这解决了我的格式化问题。我现在遇到的问题是删除需要按特定顺序进行。我需要先删除电子邮件地址,然后是 URL/域 - 如果不这样做,则将删除电子邮件域,但不会删除电子邮件。 RegEx 有效,但使用逗号而不是分号。我一直在尝试调整正则表达式,但没有运气 - 当前的正则表达式仅删除以“/”结尾的域(使用 http 或 https)。你知道我该如何调整它以适应没有 URI 路径的域以及包含完整 URI 路径的 URL?
  • 仅此而已?没问题,只需交换模式!我已经相应地编辑了代码,包括回到量词中的逗号。
  • 谢谢,太好了!我一直在尝试制作一个 MS Word 友好的正则表达式,该表达式将匹配不以 http(s) 开头的 URL/域,并且将包含“www”。以及没有前面文本的域 (google.com/asda/adasd)。对这里的最佳方法有任何想法吗?
  • 仅供参考:htt[ps]{1,2} 匹配 httpphttss,这些不是有效的协议
  • @Toto:正确,但是 httpp://yadda 或 httss://yadda 出现的几率是多少而不是错误的 URL?我认为是零。
猜你喜欢
  • 2022-11-02
  • 2011-11-09
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2017-02-05
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多