【问题标题】:Split CSV with a regex使用正则表达式拆分 CSV
【发布时间】:2015-05-23 19:49:25
【问题描述】:

我想要一个 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 包含引号部分,则始终存在仅包含引号的匹配项。可以避免吗?

【问题讨论】:

  • 请检查我更新的答案,我修改了your regex
  • 你应该在这里包含你的正则表达式,你不会投反对票。
  • 基本正则表达式(?=.*,$)([^,]+)(?:,)
  • 你没有做任何与CSV相关的事情,为什么它在问题主题中? Does string end with a comma 应该是主题。为此,它的,$。 CSV 与它有什么关系??
  • 解析 dbl 引用的 csv 的最简单方法:" 是转义字符 (?:^|,)\s*("[^"]*(?:""[^"]*)*"|[^,]*?)\s*(?=,|$) 或 '\' 是转义 (?:^|,)\s*("[^"\\]*(?:\\.[^"\\]*)*"|[^,]*?)\s*(?=,|$)。还有更多的选择可以做。但不推荐在分隔符上split

标签: regex csv split


【解决方案1】:

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

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

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

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

demo

更新

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

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

Demo 2

【讨论】:

  • hello,"world",endhello,"worl\"d",end,hello,worl"d,end, 失败
  • @Havenard:我认为它不应该匹配hello,"world",end。你读过这个问题吗?正则表达式取自above mentioned SO post,并根据要求进行调整。
  • @Havenard:再次,请阅读问题,OP 没有提到要解析的 CSV 类型,OP 对特定 SO 帖子中的正则表达式感兴趣。
  • (?=[^"]|"?) 是一个始终正确的断言。
  • 我的错误,在 Demonales 模式中是:(?=[^"]|(")?) 目标是定义捕获组 1(需要以下条件测试)。
【解决方案2】:

Thanx @stribizhev,效果很好。
如果我理解正确,逗号也可以转义:
(?=.*,$)(?:"((?:\\.|[^"])*)"|((?:\\.|[^,])*))(?:[,])
为了完整性:-)

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多