Word VBA使用正则表达式定位匹配文本的一个坑

这是摘自 孙兴华 老师在Word VBA视频教程中的笔记,作用是利用正则表达式匹配身份证号。

Sub 正则搞定身份证号()
    Set 文档 = Application.ActiveDocument
    '第2季 20.2.1
    '给对象指定正则表达式对象
    'CreateObject函数用于创建各种外部对象对象的完整名称就是参数
    Set 正则 = CreateObject("vbscript.regexp")
    'Pattern后面写正则表达式
    正则.Pattern = "[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]"
    'Global值为True返回所有符合要求的结果反之只返回第一个符合要求的结果
    正则.Global = True
    'Execute(字符串)
    Set 结果集合 = 正则.Execute(文档.Range.Text)
    For Each 身份证号 In 结果集合
        'MsgBox 身份证号
        'firstindex代表第一个下标length代表总长度
        Set 获取 = 文档.Range(身份证号.firstindex, 身份证号.firstindex + 身份证号.Length)
        获取.Font.ColorIndex = wdBlue
        获取.Font.Bold = True
End Sub


匹配到了字串需要定位在文中的位置,但是在多段文本中匹配就失效了,“文档.Range”函数并没有返回正确的 区间给 “获取”,每次离目标字符总是相隔几个。后来看到这个帖子才豁然开朗。


Sub Word文档中查找替换()
    Dim col As New Collection, k&
    Dim i%, mt, oRang As Range, n%, m%
    With CreateObject("vbscript.regexp")
        .Pattern = "" '这里各显其能输入正则表达式根据自己的需求
        .Global = True:.IgnoreCase = False:.MultiLine = True
        For Each i In ActiveDocument.Paragraphs
            For Each mt In .Execute(i.Range.Text)
                k = k + 1
                m = mt.FirstIndex: n = mt.Length
                Set oRang = ActiveDocument.Range(i.Range.Start + m, i.Range.Start + m + n)
                col.Add oRang, CStr(k)