【问题标题】: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]

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

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

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

【问题讨论】:

  • 您在解析 CSV 文件吗?
  • 是的,我正在解析一个 CSV 文件

标签: regex string kotlin split regexp-replace


【解决方案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(",")
    

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

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

    但不推荐

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 2011-06-26
      • 2020-08-03
      • 1970-01-01
      • 2013-04-02
      相关资源
      最近更新 更多