【问题标题】:MS Word VBA macro to search and replace (Regex)用于搜索和替换的 MS Word VBA 宏(正则表达式)
【发布时间】:2015-12-03 16:55:06
【问题描述】:

假设一个word文件包含

ab{cdefg{hij{k

我想将 { 向右移动一个位置

abc{defgh{ijk{

我需要创建一个包含所有字符的数组,然后使用正则表达式搜索和替换运行一个循环

搜索:

({)(array[index])

替换:

$2$1

没有循环的普通正则表达式不起作用,因为我正在处理具有复杂字符的印度文本。我已经在 inDesign 中的 JavaScript 和 ExtendScript 上完成了这项工作,但我对 VB 一无所知。有人可以帮忙吗?

【问题讨论】:

  • 你能描述一下印度文字是如何影响事物的吗?例如,某些印度语字符在 Word 中表示为 2 个字符是问题的一部分,而交换只会将“{”移动一个字符而不是 2 个字符。还是什么?
  • 是的。某些显示为一个字母而在现实生活中被视为一个字母的指示连词实际上是 Unicode 中 2-5 个字母的簇。
  • 我的(很明显)建议。如果 Word 的 Find/Replace 无法处理您正在处理的文本,请忘记正则表达式,并专注于 Word 对象模型(和 VBA)所关注的事实,将您的文档视为一系列 Word Character 对象,可以索引 1..等。然后您需要遍历字符序列以查找“{”(并可能忽略属于某些特殊印度字符序列的“{”字符,尽管我怀疑这会发生),然后检查以下字符并确定有多少 Unicode您需要移动“{”的字符。

标签: regex vba ms-word


【解决方案1】:

这可以使用 Word 通配符搜索和替换来完成:

With ActiveDocument.Range.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .ClearAllFuzzyOptions
    .Text = "(\{)(?)"           ' find opening brace followed by a single character
    .Replacement.Text = "\2\1"  ' swap positions
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchFuzzy = False
    .MatchWildcards = True
End With
ActiveDocument.Range.Find.Execute Replace:=wdReplaceAll

【讨论】:

  • 这无济于事。在其他地方找到以下代码,可以正常搜索和替换,但不能处理正则表达式With ActiveDocument.Content With Selection.Find .Text = ChrW(&HB47) & ChrW(&HB2C) .Replacement.Text = ChrW(&HB2C) & ChrW(&HB47) .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = True .Execute Replace:=wdReplaceAll, Forward:=True, _ Wrap:=wdFindContinue
  • @coldbreeze16:我的代码在您的示例文本上运行。看来您可能有不同的输入?可以发一下吗?
  • 为什么每个使用正则表达式看到单词 vba 的人都会自动使用通配符?它们不一样;正则表达式要强大得多。为什么不假设要求正则表达式的人想要正则表达式并且知道存在通配符呢?例如,您不能使用单词通配符进行多行匹配。
  • @A.Eakins 这里的问题是 Word API 不支持强大的正则表达式搜索和替换功能。使用通配符搜索是您从 Word 中获得的最佳选择。您可以做的是提取文本,对文本进行正则表达式匹配,在 Word 文档中找到匹配的文本并以编程方式替换这些文本。这是非常重要的,容易出错,而且您必须自己编写代码,因为 Word 不提供。
  • 你说得对,这很重要。这是相当困难的。我自己一直在努力解决这个问题,我只是在搜索将 RegEx 与 Visual Basic 结合使用时感到沮丧,每个人都说:“使用通配符”,在大多数情况下它更有意义,但并非全部。
猜你喜欢
  • 2019-06-17
  • 2020-06-21
  • 2021-04-28
  • 2020-08-31
  • 2013-06-14
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
相关资源
最近更新 更多