MS Word + VBA + RegEx:获取页面匹配数

时间:2013-01-09 14:19:58

标签: regex ms-word page-numbering

这可能吗?可能不是?然后我怎样才能找到匹配的所有确切匹配项和相应的页码?

编辑:

我让正则表达式正常工作。我需要的是每场比赛都能获得它出现的所有页面。

示例:

regex = \b\d{3}\b

123 appears on page 1,4,20
243 appear on page 3,5,7
523 appears on page 9

我如何获取该信息(匹配发生在所有页面上?)

这是为了自动创建某种索引。

编辑2:

我有一个基本的工作版本,代码段:

Set Matches = regExp.Execute(ActiveDocument.range.Text)

For Each Match In Matches    
    Set range = ActiveDocument.range(Match.FirstIndex, Match.FirstIndex + Len(Match.Value))    
    page = range.Information(wdActiveEndAdjustedPageNumber)

问题是Match.FirstIndex并不总是指向ActiveDocument.range中匹配的第一个字符。由于ActiveDocument.range.Text中包含的字符不在表格中表示的内容,因此Word表格会搞乱这一点。

2 个答案:

答案 0 :(得分:3)

我认为这可能更适合SuperUser。

问题的答案是“是的。”

Selection.Information(wdActiveEndAdjustedPageNumber)

VBA中的上述属性将为您提供选择的页码。

另外,VBA can do some regular expression work

答案 1 :(得分:3)

这结果相当复杂,我不能说我的解决方案是否适用于任何文件。主要问题如问题中所示,RegexMatch.FirstIndex不能用于确定实际匹配是否在MS Word文档中。这是因为正则表达式匹配是在range.Text属性(String)上完成的,并且该字符串只包含与范围对象不同的字符数量,因此索引不匹配。

所以我的解决方案是针对每场比赛,我在整个文档中查找该比赛。 find方法给出一个Range对象,从中可以确定正确的页面。

在我的特殊情况下,匹配可能是同样的东西也有不同的价值。示例:343在我的情况下与Prefix-343相同。第二个问题是匹配必须在123之前进行排序,而不管在文档中首先出现哪一个。{/ p>

如果您需要排序功能,您还需要以下#34;模块":

SortDictionary功能:

http://www.cpearson.com/excel/CollectionsAndDictionaries.htm

模块" modQSortInPlace":

http://www.cpearson.com/Zips/modQSortInPlace.zip

如果不需要排序,则您不需要它们,但您需要从我的代码中删除相应的函数调用324

现在我的代码。您可以移除的Soem部分,尤其是格式化部分。这是我的具体情况。此外,如果您的比赛是"唯一的",例如。不是前缀,所以你也可以简化代码。您需要参考" Microsoft Scripting Library"。

SortDictionary Dict, True