单个RegEx表达式,用于解码带有内嵌双引号和逗号的CSV

本文关键字:CSV 表达式 RegEx 用于 解码 单个 | 更新日期: 2023-09-27 18:10:38

我有很多CSV数据,我试图使用正则表达式解码。实际上,我试图在其他人/项目触及的现有代码基础上构建,并且不想因重构类过多而冒险破坏他们的数据流。所以,我想知道是否有可能用单个正则表达式解码这个文本(这就是类目前的工作方式):

f1,f2,f3,f4,f5,f6,f7
,"clean text","with,embedded,commas.","with""embedded""double""quotes",,"6.1",

第一行是标题。如果我将其保存为xxx.csv并在Excel中打开,它会正确地反编译它以读取(注意字段之间的空格是单元格分隔符):

f1  f2  f3  f4  f5  f6  f7
clean text  with,embedded,commas.   with"embedded"double"quotes     6.1     

但是当我在。net中尝试这个时,我被困在正则表达式上。我有这个:

string regExp = "(((?<x>(?=[,''r''n]+))|'"(?<x>([^'"]|'"'")+)'"|(?<x>[^,''r''n]+)),?)";

你可以在这里看到它的作用:

http://ideone.com/hRq8xe

结果如下:

<start>
clean text
with,embedded,commas.
with""embedded""double""quotes
6.1
<end>

这非常接近,但它不像Excel那样用单双引号替换转义的双双引号。我想不出比它更好的正则表达式了。这能做到吗?

单个RegEx表达式,用于解码带有内嵌双引号和逗号的CSV

也许您可以设法使用正则表达式条件与以下构造函数匹配字符串:

  • if-then句子 (?(?=regex)then|else)
  • 多个if-then语句 (?(?=condition)(then1|then2|then3)|(else1|else2|else3))

我想出了以下模式,以匹配您的文本主体:([^',]+(?(?=[^',])([^'"]+")|([^',]+,))),然而,您需要付出额外的努力,以便为您的文本创建完全匹配的表达式或最终使用文件解析器。如果是这样,您可以看看FileHelpers,这是一个非常简洁的库,用于解析文本文件。

来源:

  • 正则表达式条件
  • 正则表达式中的替换结构