优化换行正则表达式

时间:2013-12-10 15:13:06

标签: c# regex line-breaks

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

以下是目前的代码:

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

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

感谢您提供任何帮助。

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

\“地址 - 430楼F \ r \ n \ r \ nNickname- Joe \”
我不知道为什么这些数据都像那样疯狂,但我不希望它在引号中分裂那些\ n。

1 个答案:

答案 0 :(得分: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

偶数引号,就像在previos行中所做的那样(即与下一行合并)。

z"

奇数引号所以这次我们不应该合并。 (需要将最后一行与后一行合并,这表示输入数据形成不良) 因此,最终输出是:

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