Regex MS Word使用正则表达式、重复模式查找

Regex MS Word使用正则表达式、重复模式查找,regex,ms-word,Regex,Ms Word,我有一个带有标记(和一些未标记!)段落的文档: 1.0… … 2.4.3… … 6.18.21.8… 等等 我需要找到所有这些标签,并且只找到那些标签(不管段落内容是什么,也不管可能存在哪些其他文本,例如未标记的段落/文本)。预期的文档格式如下: 新段落字符,后跟 一个或多个数字字符,后跟 一段时间,然后是 前两个步骤的某些迭代次数,按顺序(数字字符和句点),后跟 一个或多个数字字符,后跟 两个空间 现在我有一个表达式,它可能很接近,但不正确,因为Word将第一组括号内的表达式解释为我想重复

我有一个带有标记(和一些未标记!)段落的文档:
1.0…

2.4.3…

6.18.21.8…
等等

我需要找到所有这些标签,并且只找到那些标签(不管段落内容是什么,也不管可能存在哪些其他文本,例如未标记的段落/文本)。预期的文档格式如下:

  • 新段落字符,后跟
  • 一个或多个数字字符,后跟
  • 一段时间,然后是
  • 前两个步骤的某些迭代次数,按顺序(数字字符和句点),后跟
  • 一个或多个数字字符,后跟
  • 两个空间
现在我有一个表达式,它可能很接近,但不正确,因为Word将第一组括号内的表达式解释为我想重复匹配,而不是模式。(我需要后者。)


如前所述,关于编写正则表达式以产生正确结果的任何提示?

这与您父亲的最后5个步骤相匹配,我不确定新段落字符的含义,但如果它总是相同的字符,请将其放在字符串的开头

([0-9]+.)+[0-9]+(  )
如果您开始使用VBA,这里有一个子项,它将用您更改替换变量的任何内容替换匹配项。请注意,您将需要激活正则表达式库,您可以学习如何操作(它适用于excel,但在word中也适用)。然后添加一个模块并粘贴下面的文本。我认为新角色不是\n就是\t,但我不是100%确定

Sub remove()
Dim reg As New RegExp
Dim pattern As String
Dim replace As String

replace = ""
pattern = "([0-9]+.)+[0-9]+(  )"
With reg
    .Global = True
    .MultiLine = True
    .IgnoreCase = False
    .pattern = pattern
End With


If reg.Test(ActiveDocument.Range.Text) Then ActiveDocument.Range.Text = reg.replace(ActiveDocument.Range.Text, replace)

End Sub

这与你父亲的最后5个步骤相匹配,我不确定你所说的新段落字符是什么意思,但是如果它总是相同的字符,就把它放在字符串的开头

([0-9]+.)+[0-9]+(  )
如果您开始使用VBA,这里有一个子项,它将用您更改替换变量的任何内容替换匹配项。请注意,您将需要激活正则表达式库,您可以学习如何操作(它适用于excel,但在word中也适用)。然后添加一个模块并粘贴下面的文本。我认为新角色不是\n就是\t,但我不是100%确定

Sub remove()
Dim reg As New RegExp
Dim pattern As String
Dim replace As String

replace = ""
pattern = "([0-9]+.)+[0-9]+(  )"
With reg
    .Global = True
    .MultiLine = True
    .IgnoreCase = False
    .pattern = pattern
End With


If reg.Test(ActiveDocument.Range.Text) Then ActiveDocument.Range.Text = reg.replace(ActiveDocument.Range.Text, replace)

End Sub

Word似乎不符合其自己的正则表达式文档。在某种程度上,可以通过使用搜索和替换框中的特殊下拉列表来进行帮助。在我的例子中,它插入了{;},而不是记录在案的{,}作为重复次数。(一旦你知道分号而不是逗号,你当然可以自己插入…-另一方面:即使在不同版本的Word中,这看起来也不一样。)说到重复,Word在处理这些问题时会遇到很大的麻烦

您可能希望通过搜索示例和一个小的添加来验证这一点

1.0  ...
...
2.4.3  ...
...
6.18.21.8  ...
...
...1.0  ...
使用
^13([0-9]@.)@[0-9]@
。它实际上应该匹配前三个数字-点-序列在各自的行的开头-但不是第四个,在第四个,行与其他字符开始。然而,在我的word版本中,它只与第一个匹配。这与
^13([0-9]{1;}。){1;}[0-9]{1;}
仅与第一个匹配-和
^13([0-9]{1;}。){2;}[0-9]{1;}
完全不匹配。(这同时反映了您对精确序列重复的观察,而不是要匹配的模式。)

您可能希望签入转录本作为概念证明

与您的需求最接近的可能是:

  • ^13[0-9.]{1;}
    (经过调优的
    ^13[0-9.]{1;}.[0-9]{1;}
    再次无法工作)-很遗憾,它接受模式,您实际上希望看到被排除,或者
  • 运行
    ^13[0-9]{1;}.[0-9]{1;}.[0-9]{1;}.[0-9]{1;}.[0-9]{1;}
    ^13[0-9]{1;}.[0-9]{1;}.[0-9]{1;}.[0-9]{1;}.[0-9]{1;}.
    ,等等,这些都缺乏正则表达式的美感和灵活性,但更加严格
根据您的总体需求,您最好为特定的工作使用不同的工具

顺便说一句:

  • Word使用而不是来表示任何字符。这就是为什么在上述表达式中不需要转义点的原因
  • Word实际上应该接受点或反斜杠作为
    [\.]
    -但需要
    [\\.]
    (在我的版本中)
  • “前两个步骤的某些迭代次数”(在示例代码中)被理解为最少一次
  • 由于在HTML中处理空格,上述正则表达式中的尾随空格丢失
  • 如果您对标题使用文字功能(尤其是使用各自的标题样式):您是否尝试过使用大纲视图(可能未显示正文)来进一步实现您的目的

    • Word似乎不符合其自己的正则表达式文档。在某种程度上,可以通过使用搜索和替换框中的特殊下拉列表来进行帮助。在我的例子中,它插入了{;},而不是记录在案的{,}作为重复次数。(一旦你知道分号而不是逗号,你当然可以自己插入…-另一方面:即使在不同版本的Word中,这看起来也不一样。)说到重复,Word在处理这些问题时会遇到很大的麻烦

      您可能希望通过搜索示例和一个小的添加来验证这一点

      1.0  ...
      ...
      2.4.3  ...
      ...
      6.18.21.8  ...
      ...
      ...1.0  ...
      
      使用
      ^13([0-9]@.)@[0-9]@
      。它实际上应该匹配前三个数字-点-序列在各自的行的开头-但不是第四个,在第四个,行与其他字符开始。然而,在我的word版本中,它只与第一个匹配。这