【问题标题】:Regex to split a string on the basis of comma in Java正则表达式在Java中基于逗号分割字符串
【发布时间】:2019-01-14 21:59:06
【问题描述】:

我有一个来自 csv 文件的字符串,我想拆分它。该字符串可以在双引号或 JSON 中包含逗号。 例如,如果字符串是:

abc, pq"r,s", {"one":1, "two":2}

正则表达式应将其拆分为三个标记:

  1. abc
  2. pq"r,s"
  3. {"one":1, "two":2}

我试过this regex

正则表达式如下所示:(?x)[,](?=([^"]*"[^"]*")*[^"]*$)

谁能推荐一个正确的正则表达式?

【问题讨论】:

  • 请展示您在尝试创建正则表达式时所做的工作,以便其他人可以指导您查看的位置
  • 你能展示你正在处理的正则表达式吗?
  • 如果双引号内有括号怎么办?带引号的字符串中是否有双引号的转义序列?听起来你需要一个解析器,而不是正则表达式
  • 如果您正在读取 CSV 文件,请使用 CSV 解析器。不要试图用正则表达式重新发明轮子。太容易出错了。
  • 您从使用的正则表达式中看到了什么结果?

标签: java json regex


【解决方案1】:

这是适用于您的示例 abc, pq"r,s", {"one":1, "two":2} 的正则表达式:

,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)(?=(?:[^{}]*{[^{}]*})*[^}]*$)

或查看regex101 example

这个正则表达式包含三个部分

  1. , 是我们要匹配的逗号
  2. (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$) 是基于 Bart Kiers 的主题讨论 Java: splitting a comma-separated string but ignoring commas in quotes 的展望。
  3. (?=(?:[^{}]*{[^{}]*})*[^}]*$) 是处理 { ... } 的改编前瞻。

不确定它是否适用于其他示例。

【讨论】:

  • 好吧,这让你成功了一半。现在您只需要为平衡括号添加前瞻。不要忘记忽略带引号的字符串中的括号!
  • @Patrick,我同意你和大多数 cmets 的观点,即解析器可能是最好的。不知道 OP 想用这个去哪里,但如果他想学习一些复杂的正则表达式,我希望将他指向另一篇文章,其中有一个很好的长解释该正则表达式的作用。
  • 这是一个有趣的想法,但您应该知道,它仅基于 RFC 4180 中的假设工作......即双引号通过在前面加上另一个双引号进行转义。根据@op 的示例输入,我们已经可以看出他不符合 RFC 4180。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多