【问题标题】:Splitting a string by \n but ignoring \n in quotes通过 \n 拆分字符串,但忽略引号中的 \n
【发布时间】:2015-03-27 17:46:01
【问题描述】:

我想使用位于行尾的\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

请指导我哪里出错了。

【问题讨论】:

  • 你要分割的\n除了有数字吗?
  • 使用 CSV 解析器。 .NET 有不止一种选择。
  • 可能有数字/字符/字符串
  • Stop creating your own CSV parsers!这比您想象的要难,而且有许多已经可以工作、经过测试和调试的解析器可供您投入到您的项目中。
  • 输入字符串中的\n是文字\` and n`还是换行符?

标签: c# regex string


【解决方案1】:

如果由于某种原因你不能使用 CSV 解析器,你可以使用这个正则表达式:

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

仅当它在双引号之外时才匹配\n。因为正则表达式正在向前看\n 之后的偶数个引号。

RegEx Demo

【讨论】:

  • 但最好使用 CSV 解析器。 OP 在没有 CSV 解析器的情况下的下一个问题:嵌入式逗号 (",") 和嵌入式双引号 ("""")。
  • 是的,使用 CSV 解析器绝对是最安全的方法。
  • 谢谢阿努巴瓦。您提供的正则表达式工作得很好。您能否也给我建议或提供链接,哪个 csv 解析器很有用。我也会尝试走那条路。
  • 再次感谢阿努巴瓦。我会通过链接。
【解决方案2】:

这个怎么样:

 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));

【讨论】:

  • Neil,您正在使用逗号分割字符串。我希望通过忽略引号内的 \n 来使用 \n 拆分字符串。
【解决方案3】:

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

 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");

我更喜欢惰性匹配,因此我尽可能添加? 量词。

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2018-11-03
    • 2011-06-26
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多