对于项目,我需要将字符串值分隔为字符串列表。 字符串的构建如下:
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
到目前为止,我得到一个轻微错误,如示例代码中所示。现在,我几乎就在那里。有人可以帮我解决这个正则表达式问题吗?或者有更好的方法吗?
答案 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解析器,例如CsvReader,FileHelpers,LINQtoCSV等。如果外部库不是一个选项:Microsoft.VisualBasic.FileIO.TextFieldParser
< / p>