VBA使用Regex识别特定序列多行数据块的匹配及分组提取问题
解决方案
1. 调整正则匹配模式
你需要将匹配模式改为带捕获分组的写法,精准匹配每个规则段,同时自动合并第五部分的多行内容:
^\s*(\d{6,12})\s*\n\s*(.*?)\s*\n\s*(\d{14})\s*\n\s*(\d{1,3})\s*\n\s*(.*(?:\n(?!\s*\d{6,12}\s*\n).*)?)
各分组和规则对应关系:
- 分组1:匹配6-12位数字行
- 分组2:匹配任意文本行
- 分组3:匹配14位数字行
- 分组4:匹配1-3位数字行
- 分组5:匹配后续所有内容直到下一个块的开头(即6-12位数字行),自动包含可能的第二行文本
2. 调整VBA代码,直接提取捕获分组
不需要拆分整个匹配结果,直接调用匹配项的SubMatches集合获取对应分组的内容,同时将第五分组的换行替换为空格完成合并即可:
With CreateObject("VBScript.RegExp") .Global = True: .MultiLine = True: .IgnoreCase = False ' 替换为上述调整后的正则模式 .Pattern = "^\s*(\d{6,12})\s*\n\s*(.*?)\s*\n\s*(\d{14})\s*\n\s*(\d{1,3})\s*\n\s*(.*(?:\n(?!\s*\d{6,12}\s*\n).*)?)" If .Test(sInput) Then Set col = .Execute(sInput) For i = 0 To col.Count - 1 cnt = cnt + 1 ' 直接提取5个分组,第五分组替换换行合并为一行 a(i + 1, 1) = Application.WorksheetFunction.Clean(Trim(col.Item(i).SubMatches(0))) a(i + 1, 2) = Application.WorksheetFunction.Clean(Trim(col.Item(i).SubMatches(1))) a(i + 1, 3) = Application.WorksheetFunction.Clean(Trim(col.Item(i).SubMatches(2))) a(i + 1, 4) = Application.WorksheetFunction.Clean(Trim(col.Item(i).SubMatches(3))) ' 替换换行符合并第五部分的多行内容 a(i + 1, 5) = Application.WorksheetFunction.Clean(Trim(Replace(col.Item(i).SubMatches(4), vbLf, " "))) Next i End If End With
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

