通过排除双引号内的逗号来拆分字符串

Posted

技术标签:

【中文标题】通过排除双引号内的逗号来拆分字符串【英文标题】:Split a string by Comma by excluding the ones inside Double Quotes 【发布时间】:2021-09-01 20:25:18 【问题描述】:

我特别有这个字符串:

123,abc,true,true,true,false,true,false,false,false,123,"my name is : something('Jack'), email is 'abc@gmail.com' 已经是 假如。公司的政策“xyz”是 有益的。",ABCD,591633,1

我想通过排除双引号内的逗号来用逗号分割字符串。所以我想在这里产生的输出是

[123,abc,真,真,真,假,真,假,假,假,123, “我的名字是:something('Jack') email is 'abc@gmail.com' is 已经提供。公司的政策‘xyz’是有利的。", ABCD, 591633, 1]

我曾尝试使用其他 *** 帖子的答案,但它们不适用于此类字符串。谁能帮助我如何实现这一目标?

我正在尝试在 Kotlin 中实现这一点。

我可以想到的一种方法是,首先去掉双引号内的逗号,然后用逗号分割字符串,但无法得到预期的结果。

【问题讨论】:

您在解析 CSV 文件吗? 是的,我正在解析一个 CSV 文件 【参考方案1】:

由于您尝试解析CSV 文件,因此使用现有库几乎总是比编写自己的代码好得多。优点包括:

它可以处理您没有时间了解或支持的所有极端情况和微妙之处。例如,如果双引号字符本身被引用会怎样?如果分隔符是分号、制表符、空格或逗号以外的东西怎么办? (是的,这仍然被称为 CSV,令人困惑。  例如,Excel 在某些以逗号作为小数分隔符的语言环境中写入分号。)  标题、换行符、注释行、空白行、转义序列呢?您能否处理和测试不同程序编写的所有不同的 CSV 方言? 它已经过彻底的测试,并被无数用户证明。 它会在标准发生变化、发现错误或可以提高性能时进行更新。 它很常用,因此其他开发人员可能会熟悉它。

一个例子是 Apache Commons CSV,它是免费的、开源的,并且非常容易包含在任何 Maven 或 Gradle 项目中。

【讨论】:

【参考方案2】:
var str = '"Foo","Bar, baz","Lorem","Ipsum"',
    res = str.split(/,(?=(?:(?:[^"]*")2)*[^"]*$)/);

console.log(res);  // [ '"Foo"', '"Bar, baz"', '"Lorem"', '"Ipsum"' ]

【讨论】:

这个正则表达式有效,但在 kotlin 中,您需要创建一个 Pattern 并将其传递给 split 函数。所以首先val pattern = Pattern.compile(",(?=(?:(?:[^"]*")2)*[^"]*$)")。然后str.split(pattern)【参考方案3】:

我得到了以下更改

file.nextLine()
.replace(",(?=[^\"]*\"[^\"]*(?:\"[^\"]*\"[^\"]*)*$)".toRegex(), "")
.split(",")

用“”替换引号内的逗号,并用分隔符逗号分隔字符串。

这给了我预期的输出:-)

但不推荐

【讨论】:

以上是关于通过排除双引号内的逗号来拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用逗号拆分字符串,但忽略双引号内的逗号 - javascript

在逗号上拆分字符串并忽略双引号中的逗号[重复]

逗号和双引号CSV格式的正则表达式拆分[重复]

hive导入csv文件,字段中双引号内有逗号

GROOVY - 解析CSV:忽略双引号内的逗号

Bigquery 正则表达式 - 删除双引号中的逗号