【问题标题】:Optimize Line Break Regular Expression优化换行正则表达式
【发布时间】:2013-12-10 15:13:05
【问题描述】:

我正在创建一个逗号分隔值行的字符串数组。
我需要在 \n 上拆分行,但不是引号内的换行符。

这是目前的代码:

string[] lines = Regex.Split(value, @"\n(?=(?:[^""]*""[^""]*"")*(?![^""]*""))");

执行需要很长时间。
我可以使用更好的选择吗?

感谢您对此的任何帮助。

更新 这是一个我想跳过的 \n 示例,因为它们在引号中:

\"地址- 430 楼 F\r\n\r\n昵称- 乔\"
我不知道为什么数据都像那样疯狂,但我不希望它在引号中的那些 \n 上分裂。

【问题讨论】:

  • 使用预先存在的 csv 解析器。我可以推荐几个不错的。

标签: c# regex line-breaks


【解决方案1】:

您可以在不使用正则表达式的情况下执行此操作,方法是在每个 \n 处拆分并计算每行和前一行的引号数。

第一行:

  • 偶数个引号:你应该拆分;
  • 奇数个引号:你不应该拆分;

对于其他行:

  • 偶数引号:做你对上一行所做的;
  • 奇数引号:与上一行相反;

这背后的想法是,由于引号必须成对出现,如果有奇数个引号,要么没有关闭,要么前一行的引用在这一行中关闭,相反,如果有偶数则与上一行相同。
基本上,您在每个 \n 处拆分,然后如果 \n 在引号内,则“取消拆分”(合并在一起)两行。
这种方法的好处是它可以轻松并行化!

例如,取以下文本:

"aa", "bb", "cc",\n
"11", "22", "3\n
3",\n
"xx", "y\n
y", "z\n
z"

这是如何工作的:

"aa", "bb", "cc",

第一行有偶数个引号 (6),所以这一行被正确分割。

"11", "22", "3

奇数个引号 (5) 所以你应该做与上一行相反的事情。由于上一行被拆分,这一行不应该被拆分,因此将其与下一行合并。确实,最后一个报价在下一行结束。

3",

奇数引号(1);做相反的事情。上次我们合并所以这个拆分是正确的。

"xx", "y

奇数个引号,所以我们应该做相反的事情。之前我们没有合并,所以这次我们将这一行与下面的行合并。

y", "z

偶数个引号,像上一行一样(即与下一行合并)。

z"

奇数个引号所以这次我们不应该合并。 (需要将最后一行与后面的行合并是输入数据格式错误的标志)。
因此最终的输出是:

"aa", "bb", "cc",\n
"11", "22", "33",\n
"xx", "yy", "zz"\n

【讨论】:

  • 我不确定你的意思是一个记录的结尾和另一个记录的开始:\"PA\",\"Y\",,,,,,,,,, ,,,,,,,,,,,\n\"643.0\",\"2.0\",
  • @Baxter 抱歉回复晚了。检查我的编辑,我添加了一个示例
猜你喜欢
  • 1970-01-01
  • 2017-09-18
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多