通过排除双引号内的逗号来拆分字符串
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(",")
用“”替换引号内的逗号,并用分隔符逗号分隔字符串。
这给了我预期的输出:-)
但不推荐
【讨论】:
以上是关于通过排除双引号内的逗号来拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章