正则表达式解析分隔字符串

时间:2016-05-17 09:24:50

标签: regex vba excel-vba csv excel

我在使用以下正则表达式解析分隔字符串时遇到问题(此正则表达式还考虑了当用户使用引号作为分组字符时的情况):

"[^"]*"|[^;]*

当分隔符之间没有空格时,这完全正常,例如:

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

1 个答案:

答案 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