正则表达式从csv中删除行

时间:2013-10-22 05:25:04

标签: regex csv

我有一行CSV

  

first decimal;;;first text;;second text with newlines, special symbols, including semicolons;second decimal, always present;first dot separated float, may not present;second dot separated float, may not present;third text that present only if present previous float

我需要删除第二个文本(使用新行和特殊符号)。

至于现在我的表达方式如下:

(?<=;;)(.*?)(?=;\d+)

它的第一部分不起作用,我不知道如何让它选择前面只有两个分号的文本(现在它选择前面有两个或更多分号的文本和第一个小数,后面加分号+换行符,如果我打开dotall)。此外,我不知道如何在此处添加换行符号(.*?)

1 个答案:

答案 0 :(得分:1)

如果您的CSV文件包含分号和换行符作为引用字段的一部分,那么正则表达式不是正确的工具。想象一下如果你有像"This is one field;;don't split this;42" ......

这样的字段会发生什么

如果您确定在引用字段之前或之内永远不会有两个分号,那么您可以尝试使用正则表达式。但是专用的CSV解析器绝对是一个更安全的选择。

那就是说,让我们看看为什么你的正则表达式失败了:

想象一下1;;;2;3行。你的正则表达式将匹配;2,因为它符合所有要求 - 前面有两个分号,后面有一个分号加数字。这也是字符串中此位置的最短匹配。

你能做什么?您可以使用另一个lookbehind断言来确保在当前位置之前无法匹配三个分号:

(?<=;;)(?<!;;;)(.*?)(?=;\d+)

尝试一下 - 但也要查看CSV库,因为它们可以更好地解决您的问题。