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

时间:2018-11-18 06:00:14

标签: regex excel vba excel-addins

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

我正在尝试实现类似这样的东西:

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

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

我该怎么办?

1 个答案:

答案 0 :(得分: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
  否则,您可以在下面看到后期绑定

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

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

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

我还使用了.Global,因此您将在第一次比赛后继续比赛。

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


后期绑定:

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

其他注释

我本来建议仅使用Split(),但您指出在某些情况下可能会出现多个连续空格的问题。如果不是这种情况,则根本不需要正则表达式,例如:

arrStr = Split(line)

在每次出现空格时都会分裂