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

时间:2012-02-07 00:38:12

标签: 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), ",(?=([^\""]*\""[^\""]*\"")*[^\""]*$)")

4 个答案:

答案 0 :(得分:8)

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

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

以下是逗号,后跟偶数个引号:

,(?=([^"]*"[^"]*")*[^"]*$)

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

,(?=(([^"\\]|\\.)*"([^"\\]|\\.)*")*([^"\\]|\\.)*$)

在行动here中查看。 (反斜杠加倍的原因是我想匹配文字反斜杠)。

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

splitRegex = ",(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"

答案 1 :(得分: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

输出:

Field 0: 1
Field 1: 2,3,4
Field 2: 5

答案 2 :(得分:0)

这对于解析我们收到的送货通知.csv文件非常有用。感谢您保留此解决方案。

这是我的代码版本:

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

        Row.Account = fields(0).ToString().Trim()
        Row.AccountName = fields.GetValue(1).ToString().Trim()
        Row.Status = fields.GetValue(2).ToString().Trim()
        Row.PONumber = fields.GetValue(3).ToString().Trim()
        Row.ErrorMessage = ""

    End Using
End Using

Catch ex As Exception
    Row.ErrorMessage = ex.Message
End Try

答案 3 :(得分:0)

可以通过以下方式使用regex VB.NET来实现:

,(?=(?:[^"]*"[^"]*")*[^"]*$)

正向前瞻((?= ...))确保在逗号之前存在偶数引号(即,它们成对出现,或者没有)。

[^“] *匹配非引号字符。

下面给出了一个应用正则表达式的VB.NET示例。

Imports System
Imports System.Text.RegularExpressions

Public Class Test
    Public Shared Sub Main()
        Dim theString As String = "1,""2,3,4"",5"
        Dim theStringArray As String() = Regex.Split(theString, ",(?=(?:[^""\\]*""[^""\\]*"")*[^""\\]*$)")
        For i As Integer = 0 To theStringArray.Length - 1
            Console.WriteLine("theStringArray {0}: {1}", i, theStringArray(i))
        Next
    End Sub
End Class

'Output:
'theStringArray 0: 1
'theStringArray 1: "2,3,4"
'theStringArray 2: 5