使用正则表达式拆分 CSV

Split CSV with a regex

我想要一个 CSV 解析器。但是,我想要以下内容:正则表达式必须检查 CSV 是否以逗号 , 结尾(否则正则表达式不得将 CSV 视为有效)!如果 CSV 没问题,那么我将提取 ,.

之间的文本

示例:

hello,world,end, //OK. CSV ends with ",". There are 3 matches: 'hello' 'world' 'end'

aa,bb,cc //NOT ok. CSV doesn't end with ",". No matches.

我有一个问题想 the regex suggested by @Denomales。如果 CSV 包含带引号的部分,则始终存在仅包含引号的匹配项。可以避免吗?

说到 regex suggested by @Denomales,我们可以做点什么。

为了确保我们只匹配末尾有逗号的字符串,您可以在模式的开头添加正向预测(下面用 ^ 标记):

(?=.*,$)(?:^|,)"?((?(1)[^"]*|[^,"]*))"?(?=,|$)
^^^^^^^^       | 

如果你不想捕获条目分隔标记(引号),你可以删除 (?=[^"]|(")?) 前瞻(上面用 | 标记)。

demo

更新

我看到您对上述话题发布了 2 个答案。您的正则表达式几乎就是您所需要的,只需添加前瞻性和跳过转义实体的方法:

(?=.*,$)(?:"((?:\.|[^"])*)"|([^,]*))(?:[,])

Demo 2

感谢@stribizhev,它完美无缺。
如果我理解正确,逗号也可以转义:
(?=.*,$)(?:"((?:\.|[^"])*)"|((?:\.|[^,])*))(?:[,])
只是为了完整性:-)