首页 > 解决方案 > 在 Word 文档中查找并突出显示非拉丁代码页字符

问题描述

我在网上找过这个,但不幸的是没有快乐。我可以找到很多查找和替换的示例,但在 find 和 highlight with 上却不多regex

我想做的是在 MS Word 文档中查找非拉丁代码页字符并突出显示它们。我认为最好的方法是使用regex(如果不是这种情况,欢迎提出建议)。下面的代码突出显示了整个文档:

Sub Highlight_Words()
    Dim oRE As New RegExp: oRE.Pattern = "[^a-zA-Z0-9:]"
    Dim oM As Match

    Application.ScreenUpdating = False
    Options.DefaultHighlightColorIndex = wdRed
    With ActiveDocument.Content.Find
      .ClearFormatting
      .Text = oRE.Pattern
      '.Text = "[^a-zA-Z0-9\s:]"
      '.Text = "[a-zA-Z\d\s:]"
      '.Text = "  "
      With .Replacement
        .Text = "^&"
        .ClearFormatting
        .Highlight = True
      End With
      .Forward = True
      .Wrap = wdFindContinue
      .Format = True
      .MatchWildcards = True
      .Execute Replace:=wdReplaceAll
    End With
    Application.ScreenUpdating = True

End Sub

任何帮助将不胜感激,谢谢

PS 我正在使用 Windows 7(64 位)和 Word 2013

Update1:
​​以下是示例文本:

这只是一个示例文本,用于测试非字母数字字符(即非英语字符(即À)和非数字的字符)的突出显示。此规则有一些例外,例如撇号(“2'”)或冒号(“:”)或连字符(“-”)。但是一旦我有了搜索非字母数字字符的主要模式,我就可以添加这些例外

因此,从上面的示例文本中,À应该被突出显示(我确实在文本中有其他字符,但不幸的是它们没有显示在网站上)

标签: regexvbams-word

解决方案


您不能在 Word 文档中使用 RegEx;RegEx 只能在您从文档中提取的字符串上运行(分配给字符串变量)。但是文档中的位置和任何格式信息都会丢失。任何搜索都必须使用 Word 的内置通配符功能完成,该功能类似于 RegEx,但不一样,也不是“强大”。

基本上,在给定“拉丁”代码页的情况下,要求似乎是通过 ANSI 126 的“标准”ANSI 代码中的任何内容。(您可以使用 Word 的插入符号(Insert/Symbol, More Symbols)对话框查看字符及其代码。

使用提供的示例文本进行测试,此搜索字符串有效:[!^011-^0126]. 这将搜索不在字符范围 ANSI 11(Word 的换行符)到 ANSI 126(小写 z)中的任何内容。可以在 之后附加具有更高 ANSI 代码的其他字符126,作为文字字符。

放入问题中的代码:

Sub Highlight_Words()
    Dim Pattern As String

    Pattern = "[!^011-^0126]"   
    Application.ScreenUpdating = False
    Options.DefaultHighlightColorIndex = wdRed
    With ActiveDocument.Content.Find
      .ClearFormatting
      .Text = Pattern
      With .Replacement
        .Text = "^&"
        .ClearFormatting
        .Highlight = True
      End With
      .Forward = True
      .Wrap = wdFindContinue
      .Format = True
      .MatchWildcards = True
      .Execute Replace:=wdReplaceAll
    End With
    Application.ScreenUpdating = True

End Sub

推荐阅读