我有一行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)。此外,我不知道如何在此处添加换行符号(.*?)
。
答案 0 :(得分:1)
如果您的CSV文件包含分号和换行符作为引用字段的一部分,那么正则表达式不是正确的工具。想象一下如果你有像"This is one field;;don't split this;42"
......
如果您确定在引用字段之前或之内永远不会有两个分号,那么您可以尝试使用正则表达式。但是专用的CSV解析器绝对是一个更安全的选择。
那就是说,让我们看看为什么你的正则表达式失败了:
想象一下1;;;2;3
行。你的正则表达式将匹配;2
,因为它符合所有要求 - 前面有两个分号,后面有一个分号加数字。这也是字符串中此位置的最短匹配。
你能做什么?您可以使用另一个lookbehind断言来确保在当前位置之前无法匹配三个分号:
(?<=;;)(?<!;;;)(.*?)(?=;\d+)
尝试一下 - 但也要查看CSV库,因为它们可以更好地解决您的问题。