如何用嵌入的带引号的字符串拆分逗号分隔的字符串
本文关键字:字符串 拆分 分隔 何用嵌 | 更新日期: 2023-09-27 18:26:04
我有一个字符串,我想把这个字符串拆分成一个数组,如下所示:
string stemp = "a,b,c,'"d,e f'",g,h";
array[0] = a
array[1] = b
array[2] = c
array[3] = d,e f
array[4] = g
array[5] = h
我已尝试遵循syntax
string array[] = null;
array = stemp.split(',');
这看起来像CSV,解析起来并不那么简单(当考虑转义时)。
我建议使用CSV解析器,例如位于Microsoft.VisualBasic.FileIO
命名空间中的TextFieldParser
类。
有许多替代方案,例如FileHelpers。
使用CSV解析器可能是正确的解决方案,但您也可以使用正则表达式:
var stemp = @"a,b,c,""d,e f"",g,h";
var regex = new Regex(@"^(?:""(?<item>[^""]*)""|(?<item>[^,]*))(?:,(?:""(?<item>[^""]*)""|(?<item>[^,]*)))*$");
var array = regex
.Match(stemp)
.Groups["item"]
.Captures
.Cast<Capture>()
.Select(c => c.Value)
.ToArray();
不幸的是,正则表达式往往是不可理解的,所以下面是对各个部分的简短描述:
""(?<item>[^""]*)""
这与"d,e f"
相匹配。
(?<item>[^,]*)
这与a
和b
等相匹配。这两个表达式都捕获命名组item
的相关部分。
这些表达式(我们称之为A
和B
)使用交替结构进行组合,并使用非捕获组进行分组:
(?:A|B)
让我们将这个新表达式称为C
。整个表达式是(再次使用非捕获组):
^C(?:,C)*$