Regex 用逗号分割的正则表达式+;忽略双引号内的逗号。VB.NET
我正在尝试用VB.NET解析csv文件 csv文件包含0、“1,2,3”、4等值,这些值拆分为5而不是3。Stockoverflow中有许多其他语言的例子,但我不能在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之
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上工作。谢谢