Word 2010 通配符搜索 - 查找格式为 ABC.DEF.XYZ 的文本

Word 2010 通配符搜索 - 查找格式为 ABC.DEF.XYZ 的文本

我试图在 Word 2010 中查找以下格式的文本:ABC.DEF.XYZ。这实际上是使用 Java 语法查找写入 Word 文档的代码引​​用。请注意,3 元素引用只是一个例子。实际引用至少有 2 个元素,最多有 5 个元素。

我尝试过多种通配符(和非通配符)组合来实现这一点,但都没有成功。以下是我尝试过的一些方法:

  1. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    注意,这实际上可以找到 2 元素引用。在较大的字符串中查找模式时,它会时好时坏(例如,匹配 3 元素引用中的元素 2 和 3)

  2. <([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
    给出错误 - 无效模式

  3. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    运行时间太长,Word 挂起了超过 15 分钟,却没有找到任何匹配项(文档大约有 150 页文本,所以可能太多了,无法处理)

  4. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    当我尝试这个时Word实际上崩溃了。

理想情况下,我认为#2 的工作版本是理想的 - 但是,我不知道如何使模式有效。

如果这不可能,我只能使用#1并希望它捕获所有内容(不确定为什么它匹配某些字符串而不匹配其他字符串)。

任何帮助是极大的赞赏。

答案1

您可以使用 Word 的 VBA RegEx 引擎代替 Word 的通配符搜索。


好的,任务是找到所有符合以下模式的字符串

###.###  
###.###.###
###.###.###.###
###.###.###.###.###

我能创造的最好的模式是

([\w\d]{3}\.){1,4}[\w\d]{3}

返回以下用黄色标记的匹配结果

在此处输入图片描述

图案解释

  • \w匹配来自 Az 的单个字符。不区分大小写
  • \d匹配数字 0-9
  • [\w\d]{3}匹配 3 个字符或数字,如ABCabc123Ab1- 但不匹配A$CABCD
  • ([\w\d]{3}\.){1,4}匹配 1、2、3 或 4 组,并要求有后续点\.。最后一组[\w\d]{3}不要求有后续点

VBA 宏

ALT+F11打开 VBA 编辑器。将代码粘贴到任意位置并使用以下命令执行F5

Sub RegExMark()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")

    RegEx.Global = True
    RegEx.Pattern = "([\w\d]{3}\.){1,4}[\w\d]{3}"

    Set Matches = RegEx.Execute(ActiveDocument.Range)
    For Each hit In Matches
       Debug.Print hit
       ActiveDocument.Range(hit.FirstIndex, hit.FirstIndex + hit.Length). _
         HighlightColorIndex = wdYellow
    Next hit

End Sub

警告

如示例图片中红色标记所示,当前模式存在缺陷,并且匹配过长的字符串子字符串。我尝试了 和\b[^\.]\s它们都不适用于所有情况。也许其他用户可以找到有效的解决方案?

使用的资源

答案2

我建议将文本复制到 Notepad++,然后使用 RegEx 选项进行更改。

我知道这听起来很麻烦,但是一旦你习惯了,你就可以在程序之间快速移动。

RegEx 是 Notepad++ 中查找/替换窗口的一个选项。其他编辑器也有同样的功能。

伊万

答案3

如果您确实需要使用 Word 中范围对象的 find 方法,我认为您需要多次运行文本,每次使用以下搜索通配符之一:

  1. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  2. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  3. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  4. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  5. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@) [!.a-z0-9A-Z]

  6. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  7. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  8. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

每组中的第一个将查找后面跟着非句号或字母数字的版本号。第二个将查找以句号结尾的版本号,例如句子结尾。

这些通配符将找到从版本号之前的字符到版本号之后 2 个字符之间的选择。但是,子组将被提取并分配。

使用 word 的 find 方法与通配符存在 2 个问题。一个问题是 word 无法指定 0 个或多个特定字符或相同字符组。这消除了一些可以通过正则表达式函数处理的简单匹配方法。

第二个问题是,ver # 中的句号看起来像是单词的结尾,因此尖括号对于通配符中的句号的使用来说是多余的。尖括号也不应该在外部使用,因为当在包含大量子组的字符串中找到包含少量子组的 ver # 时,它会导致错误匹配。

我还需要补充一点,如果您执行“查找”,然后执行“替换”,则应将“查找”执行返回的选择更改为其结尾等于文档结尾(希望您之前已保存此值)。这是因为如果选择等于“查找”文本,则替换命令将不会再次找到匹配的选择。我知道这对于非通配符查找/替换来说是正确的。安全总比后悔好。

相关内容