按\ n分割字符串但忽略引号中的\ n

时间:2015-03-27 17:46:02

标签: c# regex string

我想使用位于行尾的\n拆分字符串,并忽略引号内的\n

输入:

11, 12, "inside\n the\n quotes", 13, 14\n21, 22, "another \ntest\n case", 23, 24

上面的字符串应分为:

11, 12, "inside the quotes", 13, 14

21, 22, "another test case", 23, 24

我尝试过使用它:

Regex.Split(data, "\n|^(['""].+[\n].+)");

但它不会忽略引号内的\n

请指导我出错的地方。

3 个答案:

答案 0 :(得分:2)

如果由于某种原因您无法使用CSV解析器,则可以使用此正则表达式:

Regex.Split(data, "(?=(?:(?:[^\"]*\"){2})*[^\"]*$)\\n");

仅当它在双引号之外时才匹配\n。正如在\n之后,正则表达式正在预测偶数引号。

RegEx Demo

答案 1 :(得分:0)

这个怎么样:

 string value = "11, 12, \"inside\n the\n quotes\", 13, 14\n21, 22, \"another \ntest\n case\", 23, 24";
 var values =
            Regex.Split(value, "^")
                 .Where(x => !string.IsNullOrEmpty(x))
                 .SelectMany(x => Regex.Split(x, ","))
                 .Where(x => !string.IsNullOrEmpty(x));

答案 2 :(得分:0)

看起来最终的工作答案是当前答案的混合。

 var value = "11, 12, \"inside\n the\n quotes\", 13, 14\n21, 22, \"another \ntest\n case\", 23, 24";
 var values = Regex.Split(value, @"(?s)(?=(?:(?:[^""]*?""){2})*?[^""]*?$)\n");

我更喜欢延迟匹配,因此我尽可能地添加?量词。

输出:

enter image description here