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…
等等 我需要找到所有这些标签,并且只找到那些标签(不管段落内容是什么,也不管可能存在哪些其他文本,例如未标记的段落/文本)。预期的文档格式如下:
- 新段落字符,后跟
- 一个或多个数字字符,后跟
- 一段时间,然后是
- 前两个步骤的某些迭代次数,按顺序(数字字符和句点),后跟
- 一个或多个数字字符,后跟
- 两个空间
如前所述,关于编写正则表达式以产生正确结果的任何提示?这与您父亲的最后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版本中,它只与第一个匹配。这