我在使用以下正则表达式解析分隔字符串时遇到问题(此正则表达式还考虑了当用户使用引号作为分组字符时的情况):
"[^"]*"|[^;]*
当分隔符之间没有空格时,这完全正常,例如:
31.12.2015;M234;94 841,00;C
**results:**
31.12.2015
M234
94 841,00
C
然而,当一些'列#39; / values为空,如下所示:
31.12.2015;M234;94 841,00 ;C;;;0000-0000-00;0000000
问题是,它不会在我的分隔符之间返回空格,只是跳到新的分隔符。
我需要更改以修复此正则表达式?
以下是我用于循环值
的代码For Each Match In sRegex.Execute(sRow)
If Match.Length > 0 Or bDelimiter = False Then
Debug.Print Match.Value
sHolder(UBound(sHolder)) = Match.Value
ReDim Preserve sHolder(0 To UBound(sHolder) + 1)
bDelimiter = True
Else
bDelimiter = False
Debug.Print "delimiter"
End If
Next Match
答案 0 :(得分:1)
我发现问题是确定空字符串在有效项之后;
之前是否实际为空字符串,或者是否为空项目本身。
我建议将正则表达式更改为"[^"]*"|([^;]*);?
以捕获将要使用的可选;
之前的所有非;
s,并且不再有空白空间可供正则表达式匹配。但是应该引入更多逻辑。
以下是一个示例代码:
Sub ExecuteTest2()
Dim s As String
Dim sRegex As New regexp
Dim sHolder() As String
Dim strPattern As String
strPattern = """[^""]*""|([^;]*);?"
s = "31.12.2015;M234;94 841,00 ;C;;;0000-0000-00;0000000"
sRegex.Global = True
sRegex.MultiLine = False
sRegex.IgnoreCase = True
sRegex.pattern = strPattern
ReDim Preserve sHolder(0)
For Each match In sRegex.Execute(s)
If match.SubMatches.Count > 0 Then
Debug.Print match.SubMatches(0)
sHolder(UBound(sHolder)) = match.SubMatches(0)
ReDim Preserve sHolder(0 To UBound(sHolder) + 1)
Else
Debug.Print match.Value
sHolder(UBound(sHolder)) = match.Value
ReDim Preserve sHolder(0 To UBound(sHolder) + 1)
End If
Next match
End Sub