正则表达式用逗号分隔+忽略双引号内的逗号.VB.NET

shi*_*ya 5 regex vb.net

我正在尝试用VB.NET解析csv文件.

csv文件包含值0,"1,2,3",4,它分为5而不是3.Stockoverflow中有很多其他语言的例子,但我无法在VB.NET中实现它.这是我的代码到目前为止,但它不起作用...

 Dim t As String() = Regex.Split(str(i), ",(?=([^\""]*\""[^\""]*\"")*[^\""]*$)")
Run Code Online (Sandbox Code Playgroud)

mat*_*fee 8

假设你的csv格式正确("除了用于分隔字符串字段的那些,或者除了那些转义之外\"),你可以拆分逗号后面跟着偶数个非转义的"-marks".(如果你是在一组""中,只剩下一个奇数.

你尝试过的正则表达式看起来就像你在那里一样.

以下查找逗号后跟偶数个引号:

,(?=([^"]*"[^"]*")*[^"]*$)
Run Code Online (Sandbox Code Playgroud)

要修改它以查找偶数个非转义引号(假设引号用反斜杠转义\"),我将每个引号替换[^"]([^"\\]|\\.).这意味着"匹配不是"的字符而不是黑色字符,或者匹配反斜杠和紧随其后的字符".

,(?=(([^"\\]|\\.)*"([^"\\]|\\.)*")*([^"\\]|\\.)*$)
Run Code Online (Sandbox Code Playgroud)

这里看到它.(反斜杠加倍的原因是我希望匹配文字反斜杠).

现在要进入vb.net,您只需要将所有引号加倍:

splitRegex = ",(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
Run Code Online (Sandbox Code Playgroud)


Chr*_*way 5

不要使用正则表达式,而是尝试使用TextFieldParser类来读取.csv文件.它完全处理你的情况.

TextFieldParserClass

特别要看HasFieldsEnclosedInQuotes属性.

例:

注意:我使用的是字符串而不是文件,但结果是相同的.

    Dim theString As String = "1,""2,3,4"",5"

    Using rdr As New StringReader(theString)
        Using parser As New TextFieldParser(rdr)
            parser.TextFieldType = FieldType.Delimited
            parser.Delimiters = New String() {","}
            parser.HasFieldsEnclosedInQuotes = True
            Dim fields() As String = parser.ReadFields()

            For i As Integer = 0 To fields.Length - 1
                Console.WriteLine("Field {0}: {1}", i, fields(i))
            Next
        End Using
    End Using
Run Code Online (Sandbox Code Playgroud)

输出:

Field 0: 1
Field 1: 2,3,4
Field 2: 5
Run Code Online (Sandbox Code Playgroud)