如何在 Word 2010 中构建正则表达式查找/替换

如何在 Word 2010 中构建正则表达式查找/替换

我对基本的 javascript 正则表达式有一些经验,我曾用它来操作一些用户数据条目。但现在,有人问我如何操作 MS Word 2010 文档。

具体来说,我的用户会得到一长串的数字数据列表,如下所示:

1. blah blah 'car' blah blah
2. blah blah 'truck' blah blah
3. blah blah 'boat' blah blah

这是未格式化的纯文本 Word 文档。他们希望每个数字后面都有一个格式化的标题,基于单引号中的项目,例如:

1. CAR: blah blah 'car' blah blah
2. TRUCK: blah blah 'truck' blah blah
3. BOAT: blah blah 'boat' blah blah

他们目前有转录员手动进行这些更改(有时会出错)。使用 javascript/jQuery,我可以编写一些代码来获取这些数据,搜索引号中的单词,找到匹配项之前最接近的数字,并在句点后插入全大写的版本。

但是,我对 Word 中的类似功能没有太多经验。可以通过宏或某种类型的脚本来完成吗?是否可以编写我的 javascript/jQuery 代码并以某种方式让它在 Word 实例中运行?

谢谢指导!

答案1

是的!Microsoft Office VBA 本身支持正则表达式搜索。您必须在 VBA 编辑器中为每个要放置正则表达式代码的文件添加“Microsoft VBScript Regular Expressions 5.5”作为.docm参考.xlsm

VBA 代码片段

此正则表达式模块的大部分对象模型可以在 MSDN 上找到这里。似乎缺少了一点,那就是MultiLine设置。

使用方法如下:

  • 使用以下代码实例化一个新的正则表达式对象Dim rx as New RegExp
  • 根据需要设置rx.Globalrx.MultiLine和标志rx.IgnoreCase
  • 通过将适当的模式字符串分配给来定义模式rx.Pattern
  • 如果你想知道某些东西是否与正则表达式匹配,请使用rx.Test(str),它会正确返回TrueFalse
  • 调用rx.Execute(str)返回一个对象,其行为类似于从零开始的、包含零个或多个对象MatchCollection的一维数组Match
  • Match对象公开、、FirstIndex和属性。 LengthValueSubMatches
    • FirstIndexstr是找到匹配项的位置的第一个字符的从零开始的索引
    • Length是匹配部分的长度str
    • Value是匹配的字符串结果
    • SubMatches是一个从零开始的数组亚匹配组在整体比赛中
      • 不幸的是,Office VBA 正则表达式不支持命名组,例如 Python,因此可能需要反复试验才能将组索引与您感兴趣的模式部分进行匹配

我不相信有办法执行sed样式的就地替换操作——这是仅用于搜索的功能。但是,使用周围的 VBA 来按您的意愿操纵结果非常简单。

答案2

如果 Word 文档中只有纯文本,而且内容不是很大,并且您熟悉 jquery,那么您可以创建一个简单的网站,他们可以将 Word 文档复制/粘贴到其中,然后您进行必要的更改,让他们下载转换后的 Word 文档或输出所需的文本。这是否是一个好的解决方案,实际上取决于您的情况的更多细节。

宏可能也可以完成,但根据用户数量,部署给用户可能会比较困难。

答案3

如果您不熟悉 VBA 或 Python 脚本,并且 @hBy2Py 答案的想法不符合您的能力,请尝试使用 GoogleSheets/Excel 实现您的算法:

  1. 上传=将未格式化的纯文本 word=txt 文档导入 G'Sheet。假设您的列表位于 A 列。
  2. 在 B 列中为所有列编写嵌套公式,使用 REGEXEXTRACT 对引号中的单词进行格式化,并将该单词大写=ARRAYFORMULA(UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)")))
  3. ...或将 C 列单独列出,并将该词大写:=UPPER(B:B)
  4. 在 C 列(或 D 列)中,将新列表与 CAPS 单词合并(有几种方法可以做到这一点,例如通过拆分/连接或仅=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&B:B&": "))

总结:

=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)"))&": "))

其他解决方法可能是使用此处描述的解决方案:使用通配符/正则表达式在 Notepad++ 中查找和替换

相关内容