CSV正则表达式
本文关键字:正则表达式 CSV | 更新日期: 2023-09-27 18:11:52
我继承了一些使用正则表达式解析CSV格式数据的代码。在此之前,它不需要处理空字符串字段,但是需求已经改变,因此空字符串字段是可能的。
我已经改变了正则表达式:
new Regex("((?<field>[^'",''r''n]+)|'"(?<field>([^'"]|'"'")+)'")(,|(?<rowbreak>''r''n|''n|$))");
new Regex("((?<field>[^'",''r''n]*)|'"(?<field>([^'"]|'"'")*)'")(,|(?<rowbreak>''r''n|''n|$))");
(即。我已经把+改成了*)
问题是,我现在得到一个额外的空字段在结束,例如。"ID,Name,Description"返回四个字段:"ID","Name","Description"answers"
有人知道为什么吗?
这个:
var rx = new Regex("((?<=^|,)(?<field>)(?=,|$)|(?<field>[^'",''r''n]+)|'"(?<field>([^'"]|'"'")*)'")(,|(?<rowbreak>''r''n|''n|$))");
我将"blank"字段的处理移到了第三个"or"。现在,对""
的处理已经工作了(您不需要修改它,它是代码的第二个(?<field>)
块),所以您需要处理的是四种情况:
,
,Id
Id,
Id,,Name
这个应该能做到:
(?<=^|,)(?<field>)(?=,|$)
空字段必须以行^
开头或以,
开头,长度必须为零((?<field>)
捕获中没有任何内容),并且必须后跟,
或行$
结尾。
我建议您使用FileHelpers库。它很容易使用,完成它的工作,维护你的代码会容易得多。
正则表达式的问题是它匹配空字符串。现在$
的工作方式有点像向前看——它保证匹配在字符串的末尾,但不是匹配的一部分。
所以当你有"ID,Name,Description"时,你的第一个匹配是
ID,
,其余为"Name,Description"
那么下一个匹配项是
Name,
,其余为"Description"
下一个匹配项:
Description
,其余为""
最后匹配的是空字符串