CSV正则表达式

时间:2011-10-20 08:29:40

标签: c# regex csv

我继承了一些使用正则表达式来解析CSV格式数据的代码。它现在不需要处理空字符串字段,但是要求已经改变,因此空字符串字段是可能的。

我已经改变了正则表达式:

new Regex("((?<field>[^\",\\r\\n]+)|\"(?<field>([^\"]|\"\")+)\")(,|(?<rowbreak>\\r\\n|\\n|$))");

到这个

new Regex("((?<field>[^\",\\r\\n]*)|\"(?<field>([^\"]|\"\")*)\")(,|(?<rowbreak>\\r\\n|\\n|$))");

(即我已将+更改为*)

问题是我现在最后得到一个额外的空字段,例如“ID,名称,描述”返回四个字段:“ID”,“名称”,“描述”和“”

有人能说出原因吗?

3 个答案:

答案 0 :(得分:2)

这一个:

var rx = new Regex("((?<=^|,)(?<field>)(?=,|$)|(?<field>[^\",\\r\\n]+)|\"(?<field>([^\"]|\"\")*)\")(,|(?<rowbreak>\\r\\n|\\n|$))");

我将“空白”字段的处理移动到第三个“或”。现在,""的处理已经有效(并且您不需要修改它,它是代码的第二个(?<field>)块),所以您需要处理的是四种情况:

,
,Id
Id,
Id,,Name

这个人应该这样做:

(?<=^|,)(?<field>)(?=,|$)

空字段必须以行^的开头或,开头,长度必须为零((?<field>)捕获中没有任何内容)必须后跟,或行$的结尾。

答案 1 :(得分:1)

我建议您使用FileHelpers库。它易于使用,它的工作和维护代码将更容易。

答案 2 :(得分:1)

你的正则表达式的问题是它匹配空字符串。 现在$有点像预测 - 它保证匹配位于字符串的末尾,但不是匹配的一部分。

所以当你有“ID,姓名,描述”时,你的第一场比赛是

ID,,其余为"Name,Description"

然后下一场比赛是

Name,,其余为"Description"

下一场比赛:

Description,其余为""

所以最终的匹配是匹配空字符串。