【发布时间】:2018-11-18 06:00:14
【问题描述】:
我正在编写一个 Excel 插件来读取文本文件、提取值并将它们写入 Excel 文件。我需要分割一行,由一个或多个空格分隔,并以数组的形式存储,我想从中提取所需的值。
我正在尝试实现这样的东西:
arrStr = Split(line, "/^\s*/")
但编辑器在编译时抛出错误。
我怎样才能做我想做的事?
【问题讨论】:
标签: regex excel vba excel-addins
我正在编写一个 Excel 插件来读取文本文件、提取值并将它们写入 Excel 文件。我需要分割一行,由一个或多个空格分隔,并以数组的形式存储,我想从中提取所需的值。
我正在尝试实现这样的东西:
arrStr = Split(line, "/^\s*/")
但编辑器在编译时抛出错误。
我怎样才能做我想做的事?
【问题讨论】:
标签: regex excel vba excel-addins
如果您正在寻找正则表达式路线,那么您可以这样做:
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)
每次出现空格都会拆分
【讨论】:
.Pattern = "\S+" 和 arrStr(i) = .Item(i)(无需访问 Submatches(0))