1

我有一条来自 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,它会选择第一个小数前面有分号 + 换行符)。此外,我不知道如何在此处包含换行符(.*?)

4

1 回答 1

1

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

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

也就是说,让我们看看您的正则表达式失败的原因:

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

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

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

试一试 - 但也请查看 CSV 库,因为它们会更好地解决您的问题。

于 2013-10-22T05:34:41.757 回答