【问题标题】:How to split a string in VBA to array by Split function delimited by Regular Expression如何通过正则表达式分隔的拆分函数将VBA中的字符串拆分为数组
【发布时间】:2018-11-18 06:00:14
【问题描述】:

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

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

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

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

我怎样才能做我想做的事?

【问题讨论】:

  • Split 不会那样做。你需要找到另一种方法。为什么任意的“一条线”要求? Reflex 可以用几行来点缀它
  • 你仍然无法使用Split() 函数来做到这一点。问题,这真的是您标记的 VBScript 吗?还是您实际上在使用vba“Visual Basic for Applications”? VBA 是您在 Excel 中按 Alt + F11 时得到的 - 而不是 VBScript。
  • 感谢您的澄清 - 请edit 提出您的问题并更新正确的标签,以便吸引正确的受众?
  • split 做正则表达式。

标签: regex excel vba excel-addins


【解决方案1】:

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

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,而不是您要查找的空白字符 - 因为它没有被转义。
    • 即使它被转义,你也会匹配你使用的每个字符串,因为你的量词:* 表示匹配 或更多 \S。您可能正在寻找 + 量词(一个或多个)。
    • 你很擅长让它变得贪婪(不使用*?),因为你想尽可能多地消费。

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

我也使用了.Global,所以你将在第一次匹配后继续匹配。

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


后期绑定:

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)

每次出现空格都会拆分

【讨论】:

  • @kush.impetus 如果删除冗余捕获组,它会更干净:.Pattern = "\S+"arrStr(i) = .Item(i)(无需访问 Submatches(0)
  • @WiktorStribiżew 感谢您指出这一点 - 这是我正在采取的不同路线的一部分。我纠正了它:)
  • @K.Davis。谢谢。您的代码使我的任务变得更加轻松。
猜你喜欢
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多