Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用逗号分割的正则表达式+;忽略双引号内的逗号。VB.NET_Regex_Vb.net - Fatal编程技术网

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

Regex 用逗号分割的正则表达式+;忽略双引号内的逗号。VB.NET,regex,vb.net,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), ",(?=([^\""]*\""[^\""]*\"")*[^\""]*$)") 假设您的csv格式正确(即除了用于分隔字符串字段的csv之外,没有“”),或者除了像“\””这样转义的csv之

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

csv文件包含0、“1,2,3”、4等值,这些值拆分为5而不是3。Stockoverflow中有许多其他语言的例子,但我不能在VB.NET中实现它。 这是我到目前为止的代码,但它不工作

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

假设您的csv格式正确(即除了用于分隔字符串字段的csv之外,没有“”),或者除了像“
\”
”这样转义的csv之外,您可以在逗号上拆分,逗号后面跟有一个“偶数个非转义“-”标记()(如果您在一组“”中,则行中只剩下一个奇数)

你试过的正则表达式看起来就快成功了

下面将查找逗号后跟偶数的任何类型的引号:

,(?=([^"]*"[^"]*")*[^"]*$)
splitRegex = ",(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
为了修改它以查找偶数个非转义引号(假设引号是用反斜杠转义的,如
\”
),我将每个
[^”]
替换为
([^“\]\\)
。这意味着“匹配一个非黑色斜杠的字符,或者匹配一个反斜杠和紧跟其后的字符”

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

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

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

尝试使用TextFieldParser类来读取.csv文件,而不是正则表达式。它可以准确地处理您的情况

特别是看看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

这对于解析我们收到的Shipping Notice.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

可以通过以下方式使用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

嗯,正则表达式在我发布的关于你在问题中给出的输入的链接中起作用,所以这可能是另一个问题。你确定str(i)是你所期望的吗?谢谢你的回复。我尝试了你的代码,但我得到了一个错误。“无法使用当前分隔符分析第1行。”代码与为我编写的代码一样有效。你改了吗?你的代码有什么不同?这是我两年来一直在寻找的东西。不知道为什么以前从未出现过。谢谢完美,无需任何外部库。在VS2019上工作。谢谢