【问题标题】:Split comma delimited string to array using regex使用正则表达式将逗号分隔的字符串拆分为数组
【发布时间】:2013-06-21 13:55:11
【问题描述】:

我有一个如下的字符串,需要使用 VB.NET 将其拆分为一个数组

10,"测试, t1",10.1,,,"123"

结果数组必须有6行如下

10
Test, t1
10.1
(empty)
(empty)
123

所以: 1. 字符串周围的引号必须去掉 2. 逗号可以在字符串中,并且会保留在那里(结果数组中的第 2 行) 3. 可以有空字段(源字符串中逗号后的逗号,中间没有任何内容)

谢谢

【问题讨论】:

    标签: regex vb.net csv split


    【解决方案1】:

    为什么不直接使用 split 方法?

    Dim s as String = "10,\"Test, t1\",10.1,,,\"123\""
    s = s.Replace("\"","")
    Dim arr as String[] = s.Split(',')
    

    我的 VB 生锈了,所以考虑一下这个伪代码

    【讨论】:

    • 不起作用,因为它还会拆分我不想要的第二个“字段”“测试,T1”
    • 这是一个开始,您肯定需要自己处理边缘情况或使用其他答案建议的库。
    【解决方案2】:

    不要使用String.Split():它很慢,并且没有考虑到许多可能的边缘情况。

    不要使用正则表达式。 RegEx 可以精确地做到这一点,但要正确解释所有情况,表达式往往非常复杂,难以维护,并且在这一点上并不比 .Split() 选项快多少。

    请使用专用的 CSV 解析器。选项包括 Microsoft.VisualBasic.TextFieldParser 类型、FastCSVlinq-to-csvparser I wrote 用于另一个答案。

    【讨论】:

    • 编码示例怎么样? :)
    【解决方案3】:

    你可以自己写一个函数。这应该可以解决问题:

    Dim values as New List(Of String)
    Dim currentValueIsString as Boolean
    Dim valueSeparator as Char = ","c
    Dim currentValue as String = String.Empty
    
    For Each c as Char in inputString
       If c = """"c Then
         If currentValueIsString Then
            currentValueIsString = False
         Else 
            currentValueIsString = True
         End If
       End If
    
       If c = valueSeparator Andalso not currentValueIsString Then
         If String.IsNullOrEmpty(currentValue) Then currentValue = "(empty)"
         values.Add(currentValue)
         currentValue = String.Empty
       End If
    
       currentValue += c
    Next
    

    【讨论】:

      【解决方案4】:

      这是另一种按分隔符而不是按字符循环的简单方法:

      Public Function Parser(ByVal ParseString As String) As List(Of String)
          Dim Trimmer() As Char = {Chr(34), Chr(44)}
          Parser = New List(Of String)
          While ParseString.Length > 1
              Dim TempString As String = ""
              If ParseString.StartsWith(Trimmer(0)) Then
                  ParseString = ParseString.TrimStart(Trimmer)
                  Parser.Add(ParseString.Substring(0, ParseString.IndexOf(Trimmer(0))))
                  ParseString = ParseString.Substring(Parser.Last.Length)
                  ParseString = ParseString.TrimStart(Trimmer)
              ElseIf ParseString.StartsWith(Trimmer(1)) Then
                  Parser.Add("")
                  ParseString = ParseString.Substring(1)
              Else
                  Parser.Add(ParseString.Substring(0, ParseString.IndexOf(Trimmer(1))))
                  ParseString = ParseString.Substring(ParseString.IndexOf(Trimmer(1)) + 1)
              End If
          End While
      End Function
      

      这会返回一个列表。如果你必须有一个数组,只需在调用函数时使用 ToArray 方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        相关资源
        最近更新 更多