|
楼主 |
发表于 2024-8-27 14:00
|
显示全部楼层
再做实验,发现把三个控件放在一块(紧挨着放在第一段的后面),可以不改代码,word居然把三个控件合并当做一个单词词处理,只不过将单个的35乘以3,由原来的35变成了105。
请看下例。
Sub 要求匹配解析捕获四个()
Dim mt, mk, oRng As Range, n&, m&
Dim str$, tt$, arr() As Range, x%
Dim rg As Range, dic As Object, k&, ph As Paragraph
Set Ydoc = ThisDocument
Set dic = CreateObject("Scripting.Dictionary")
osr = Ydoc.Content
'************************
Set ph = Ydoc.Paragraphs(1) '在word其他版本中,这两句可能书写不同。
Set wt = ph.Range.Words(ph.Range.Words.Count - 1)
r = wt.End - wt.Start '有控件的,用这句。若有把控件放在结尾,并测出该控件所占据的字符数。
'譬如此文档中的几个控件经意义测试可测出r值为
MsgBox r
'*************************
str = Replace(Replace(osr, Chr(7), ""), Chr(1), "")
With CreateObject("vbscript.regexp")
.Global = True
.Ignorecase = False
.MultiLine = True
.Pattern = "(^解析\s*)([A-D].+?)([A-D].+?)([A-D].+?)$" '捕获四项
'.Pattern = "(^解析\s+)([A-D].+?)?([A-D].+?)?([A-D].+?)?([A-D].+?)?$ '效果同上
'.Pattern = "(^解析\s*)([A-D].*?)([A-D].*?)([A-D].*?)$" '捕获四项,与上同。
'.Pattern = "(^解析\s*)([A-D].*?){3}$" '捕获两项
'.Pattern = "(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*){3}\r" '捕获两项 子项:“解析”二字,“解析”的第三项,因[A-D]属于解析部分的小项,属于第三级别,不可在第二级别捕获到。
'.Pattern = "(^解析[^\r]*)(([A-D](?:(?![A-D\r]).)*){3})\r" '捕获两项 “解析”二字,整个"解析"内容。
For Each mt In .Execute(str)
m = mt.FirstIndex + r: n = mt.Length '
Set oRng = Ydoc.Range(m, m + n)
MsgBox oRng
Next
End With
End Sub
|
|