【问题标题】:regex parsing delimited string正则表达式解析分隔字符串
【发布时间】:2016-05-17 09:24:49
【问题描述】:

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

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

当分隔符之间没有空格时,这可以很好地工作,例如:

31.12.2015;M234;94 841,00;C

**results:**
31.12.2015
M234
94 841,00
C

但是,当某些“列”/值为空时,它会失败,例如:

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

【问题讨论】:

    标签: regex vba excel csv


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2020-08-03
      • 2014-08-17
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多