如何用嵌入的带引号的字符串拆分逗号分隔的字符串

本文关键字:字符串 拆分 分隔 何用嵌 | 更新日期: 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>[^,]*)

这与ab等相匹配。这两个表达式都捕获命名组item的相关部分。

这些表达式(我们称之为AB)使用交替结构进行组合,并使用非捕获组进行分组:

(?:A|B)

让我们将这个新表达式称为C。整个表达式是(再次使用非捕获组):

^C(?:,C)*$