VBA,正则表达式:Submatch FirstIndex和Length

时间:2013-03-20 00:01:28

标签: regex vba vb6 string-matching

我有一个复杂的分组正则表达式,但在RegExp 5.5中,匹配的子匹配作为字符串返回,没有.FirstIndex和.Length的曝光。捕获的字符串不是唯一的。

正则表达式:

([A-Z]+)\s+\[A-Z]?\s+(\d{3})\-(\d{3})\s+([A-Z]?)\-([A-Z]?)

示例文字:

BLAHBLAH A 100-100 A-A    
BLAH 101-101   A-

输出:

0:BLAHBLAH           0:BLAH
1:100                1:101
2:100                2:101
3:A                  3:A
4:A                  4: 

目前,我遍历子匹配,搜索子字符串,找到位置,替换为空格:

Dim ub as Long: ub = MatchCollection.Matches(0).Submatches.Count-1
Dim fi() as Long, ln() as Long: Redim fi(ub): Redim ln(ub)

For i = 0 to ub
    fi(i) = Clng(Instr(1, Text, MatchCollection.Matches(0).Submatches(i))
    ln(i) = Clng(Len(MatchCollection.Matches(0).Submatches(i))

    Mid(Text, fi(i), ln(i)) = String$(ln(i), Chr(32))
Next i

这显然不适用于第一个示例字符串,因为正则表达式不会捕获第一次出现的A.

非常感谢任何想法!

1 个答案:

答案 0 :(得分:0)

好的,找到了解决方案。在循环中我需要在匹配之前清除所有字符,因此不是:

Mid(Text, fi(i), ln(i)) = String$(ln(i), Chr(32))

我需要:

Mid(Text, 1, (fi(i)-1)+ ln(i)) = String$(fi(i)-1+ln(i), Chr(32))