我试图在 Word 2010 中查找以下格式的文本:ABC.DEF.XYZ。这实际上是使用 Java 语法查找写入 Word 文档的代码引用。请注意,3 元素引用只是一个例子。实际引用至少有 2 个元素,最多有 5 个元素。
我尝试过多种通配符(和非通配符)组合来实现这一点,但都没有成功。以下是我尝试过的一些方法:
<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
注意,这实际上可以找到 2 元素引用。在较大的字符串中查找模式时,它会时好时坏(例如,匹配 3 元素引用中的元素 2 和 3)<([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
给出错误 - 无效模式<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
运行时间太长,Word 挂起了超过 15 分钟,却没有找到任何匹配项(文档大约有 150 页文本,所以可能太多了,无法处理)<([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 个字符或数字,如ABC
、abc
、123
、Ab1
- 但不匹配A$C
或ABCD
([\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 方法,我认为您需要多次运行文本,每次使用以下搜索通配符之一:
[!.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]@)[.][!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]([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]@).([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]@).([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]@).([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]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]
每组中的第一个将查找后面跟着非句号或字母数字的版本号。第二个将查找以句号结尾的版本号,例如句子结尾。
这些通配符将找到从版本号之前的字符到版本号之后 2 个字符之间的选择。但是,子组将被提取并分配。
使用 word 的 find 方法与通配符存在 2 个问题。一个问题是 word 无法指定 0 个或多个特定字符或相同字符组。这消除了一些可以通过正则表达式函数处理的简单匹配方法。
第二个问题是,ver # 中的句号看起来像是单词的结尾,因此尖括号对于通配符中的句号的使用来说是多余的。尖括号也不应该在外部使用,因为当在包含大量子组的字符串中找到包含少量子组的 ver # 时,它会导致错误匹配。
我还需要补充一点,如果您执行“查找”,然后执行“替换”,则应将“查找”执行返回的选择更改为其结尾等于文档结尾(希望您之前已保存此值)。这是因为如果选择等于“查找”文本,则替换命令将不会再次找到匹配的选择。我知道这对于非通配符查找/替换来说是正确的。安全总比后悔好。