单个RegEx表达式,用于解码嵌入了双引号和逗号的CSV

时间:2014-06-27 14:52:27

标签: c# .net regex excel csv

我正在尝试使用正则表达式解码许多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那样用单双引号替换转义的双引号。我无法想出一个效果更好的正则表达式。可以吗?

1 个答案:

答案 0 :(得分:1)

也许您可以通过 regular-expression-conditionals 与以下构造函数以某种方式设法匹配您的字符串:

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

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

来源: