如何通过正则表达式分隔的分割函数将VBA中的字符串拆分为数组

问题描述 投票:1回答:1

我正在编写Excel Add In来读取文本文件,提取值并将它们写入Excel文件。我需要分割一行,由一个或多个空格分隔,并以数组的形式存储,我想从中提取所需的值。

我试图实现这样的事情:

arrStr = Split(line, "/^\s*/")

但编辑在编译时抛出错误。

我怎么能做我想做的事?

regex excel vba excel-addins
1个回答
5
投票

如果您正在寻找正则表达式路线,那么您可以这样做:

Dim line As String, arrStr, i As Long
line = "This is a  test"

With New RegExp
    .Pattern = "\S+"
    .Global = True
    If .test(line) Then
        With .Execute(line)
            ReDim arrStr(.Count - 1)
            For i = 0 To .Count - 1
                arrStr(i) = .Item(i)
            Next
        End With
    End If
End With

重要提示:您需要创建一个引用: Microsoft VBScript Regular Expressions 5.5在工具>参考文献中 否则,您可以在下面看到Late Binding

您原始模式\^S*\$的原始实现存在一些问题:

  • S*实际上匹配一个文字大写的S,而不是你正在寻找的空白字符 - 因为它没有被转义。 即使它被转义,你也会因为你的量词而匹配你使用的每一个字符串:*意味着匹配零个或多个\S。您可能正在寻找+量词(一个或多个)。 因为你想要尽可能多地消费,所以你很贪婪(不使用*?)。

我使用的模式:(\S+)被放置在一个捕获组(...),它将捕获所有\S+的情况(所有字符不是白色空间,+一次或多次。

我也使用了.Global,所以你会在第一场比赛后继续比赛。

一旦捕获了所有单词,就可以遍历匹配集并将它们放入数组中。


Late Binding:

Dim line As String, arrStr, i As Long
line = "This is a  test"

With CreateObject("VBScript.RegExp")
    .Pattern = "\S+"
    .Global = True
    If .test(line) Then
        With .Execute(line)
            ReDim arrStr(.Count - 1)
            For i = 0 To .Count - 1
                arrStr(i) = .Item(i)
            Next
        End With
    End If
End With

Miscellaneous Notes

我本来建议只使用Split(),但你说有些情况下连续多个空间可能是个问题。如果不是这种情况,你根本不需要正则表达式,例如:

arrStr = Split(line)

会在每个空间的出现上分裂

© www.soinside.com 2019 - 2024. All rights reserved.