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"

有人知道为什么吗?

CSV正则表达式

这个:

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,其余为""

最后匹配的是空字符串