正则表达式排除字符串到数组

时间:2017-01-10 10:35:58

标签: c# regex

对于项目,我需要将字符串值分隔为字符串列表。 字符串的构建如下:

string unprocessed = "\"foo,bar\",\"foobar\",\"shizzle ma nizzle\"";

我希望将int插入如下的数组中:

string[] processed = [] { "\"foo,bar\"", "\"foobar\"", "\"shizzle ma nizzle\""};

为此,我使用正则表达式匹配系统,它将","上的代码分开。人物组合。我到目前为止的代码如下:

Regex reg = new Regex(@"((?!(,""|"",)).)+");
string regmatch = "\"\"wubba,lubba\",\"dup dub\"\"";
var matches =  reg.Matches(regmatch);

Assert.AreEqual(2, matches.Count);
Assert.AreEqual("\"dup dub\"\"", matches[1].Value); // passes
Assert.AreEqual("\"\"wubba,lubba\"", matches[0].Value); // fails because value = \"\"wubba,lubba

到目前为止,我得到一个轻微错误,如示例代码中所示。现在,我几乎就在那里。有人可以帮我解决这个正则表达式问题吗?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

只需捕获内部带引号和非引号符号的序列:

var processed = Regex.Matches(unprocessed, "\"[^\"]+\"")
                     .Cast<Match>()
                     .Select(m => m.Value)
                     .ToArray();

输出:

[
  "\"foo,bar\"",
  "\"foobar\"",
  "\"shizzle ma nizzle\""
]

如果简单的可枚举对你有好处,你可以使用简单的简单查询:

var processed = from Match m in Regex.Matches(unprocessed, "\"[^\"]+\"")
                select m.Value;

答案 1 :(得分:2)

由于您的要求还要求您在任何给定的子字符串中捕获多个冗余引号(为什么???),谢尔盖别列佐夫斯基模式的调整应该会产生预期的结果:

var processed = Regex.Matches(unprocessed, "\"+[^\"]+\"+")
                     .Cast<Match>()
                     .Select(m => m.Value)
                     .ToList();

答案 2 :(得分:0)

使用Regex解析CSV是我所知道的第二个最糟糕的方法。例如,CSV中的a"b,c""a""b,c""",无法使用RegEx对其进行可靠解析,并会在结果中保留转义""

我建议您寻找专用的CSV解析器,例如CsvReaderFileHelpersLINQtoCSV等。如果外部库不是一个选项:Microsoft.VisualBasic.FileIO.TextFieldParser < / p>

Parsing CSV files in C#, with header