我继承了一些使用正则表达式来解析CSV格式数据的代码。它现在不需要处理空字符串字段,但是要求已经改变,因此空字符串字段是可能的。
我已经改变了正则表达式:
new Regex("((?<field>[^\",\\r\\n]+)|\"(?<field>([^\"]|\"\")+)\")(,|(?<rowbreak>\\r\\n|\\n|$))");
到这个
new Regex("((?<field>[^\",\\r\\n]*)|\"(?<field>([^\"]|\"\")*)\")(,|(?<rowbreak>\\r\\n|\\n|$))");
(即我已将+更改为*)
问题是我现在最后得到一个额外的空字段,例如“ID,名称,描述”返回四个字段:“ID”,“名称”,“描述”和“”
有人能说出原因吗?
答案 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
,其余为""
所以最终的匹配是匹配空字符串。