如何通过正则表达式分隔的 Split 函数将 VBA 中的字符串拆分为数组
How to split a string in VBA to array by Split function delimited by Regular Expression
我正在编写一个 Excel 加载项来读取文本文件、提取值并将它们写入 Excel 文件。我需要拆分一条线,由 一个或多个空格分隔 并将其以数组的形式存储,我想从中提取所需的值。
我正在尝试实现这样的东西:
arrStr = Split(line, "/^\s*/")
但是编辑器在编译时抛出错误。
我怎样才能做我想做的事?
如果您正在寻找正则表达式路由,那么您可以这样做:
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
IMPORTANT: You will need to create a reference to:
Microsoft VBScript Regular Expressions 5.5
in Tools > References
Otherwise, you can see Late Binding below
您对原始模式的原始实施 \^S*$
存在一些问题:
S*
实际上匹配的是文字大写字母 S,而不是您要查找的白色 space 字符 - 因为它没有被转义。
- 即使它被转义了,你也会匹配你使用的每个字符串,因为你的量词:
*
意味着匹配 零 或更多 \S
.您可能正在寻找 +
量词(一个 或更多)。
- 你让它变得贪婪(不使用
*?
)很好,因为你想尽可能多地消费。
我使用的模式:(\S+)
被放置在一个 捕获组 (...)
中,它将捕获 \S+
的所有情况(所有字符不是白色 space、+
一次或多次。
我也用了.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()
,但您说在某些情况下连续使用多个 space 可能是个问题。如果不是这种情况,您根本不需要正则表达式,例如:
arrStr = Split(line)
每次出现 space
都会分裂
我正在编写一个 Excel 加载项来读取文本文件、提取值并将它们写入 Excel 文件。我需要拆分一条线,由 一个或多个空格分隔 并将其以数组的形式存储,我想从中提取所需的值。
我正在尝试实现这样的东西:
arrStr = Split(line, "/^\s*/")
但是编辑器在编译时抛出错误。
我怎样才能做我想做的事?
如果您正在寻找正则表达式路由,那么您可以这样做:
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
IMPORTANT: You will need to create a reference to:
Microsoft VBScript Regular Expressions 5.5
in Tools > References
Otherwise, you can see Late Binding below
您对原始模式的原始实施 \^S*$
存在一些问题:
S*
实际上匹配的是文字大写字母 S,而不是您要查找的白色 space 字符 - 因为它没有被转义。- 即使它被转义了,你也会匹配你使用的每个字符串,因为你的量词:
*
意味着匹配 零 或更多\S
.您可能正在寻找+
量词(一个 或更多)。 - 你让它变得贪婪(不使用
*?
)很好,因为你想尽可能多地消费。
- 即使它被转义了,你也会匹配你使用的每个字符串,因为你的量词:
我使用的模式:(\S+)
被放置在一个 捕获组 (...)
中,它将捕获 \S+
的所有情况(所有字符不是白色 space、+
一次或多次。
我也用了.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()
,但您说在某些情况下连续使用多个 space 可能是个问题。如果不是这种情况,您根本不需要正则表达式,例如:
arrStr = Split(line)
每次出现 space
都会分裂