当前位置: 首页 > 面试题库 >

Java:分割逗号分隔的字符串,但忽略引号中的逗号

戚翼
2023-03-14
问题内容

我有一个模糊的字符串,像这样:

foo,bar,c;qual="baz,blurb",d;junk="quux,syzygy"

我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。(编辑:我想我的意思是那些已经属于JDK或已经属于诸如Apache Commons之类的常用库的库。)

上面的字符串应分为:

foo
bar
c;qual="baz,blurb"
d;junk="quux,syzygy"

注意:这不是CSV文件,它是文件中包含的单个字符串,具有较大的整体结构


问题答案:

尝试:

public class Main { 
    public static void main(String[] args) {
        String line = "foo,bar,c;qual=\"baz,blurb\",d;junk=\"quux,syzygy\"";
        String[] tokens = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1);
        for(String t : tokens) {
            System.out.println("> "+t);
        }
    }
}

输出:

> foo
> bar
> c;qual="baz,blurb"
> d;junk="quux,syzygy"

换句话说:仅当逗号逗号为零或引号是偶数时,才对逗号进行拆分

或者,对眼睛有点友好:

public class Main { 
    public static void main(String[] args) {
        String line = "foo,bar,c;qual=\"baz,blurb\",d;junk=\"quux,syzygy\"";

        String otherThanQuote = " [^\"] ";
        String quotedString = String.format(" \" %s* \" ", otherThanQuote);
        String regex = String.format("(?x) "+ // enable comments, ignore white spaces
                ",                         "+ // match a comma
                "(?=                       "+ // start positive look ahead
                "  (?:                     "+ //   start non-capturing group 1
                "    %s*                   "+ //     match 'otherThanQuote' zero or more times
                "    %s                    "+ //     match 'quotedString'
                "  )*                      "+ //   end group 1 and repeat it zero or more times
                "  %s*                     "+ //   match 'otherThanQuote'
                "  $                       "+ // match the end of the string
                ")                         ", // stop positive look ahead
                otherThanQuote, quotedString, otherThanQuote);

        String[] tokens = line.split(regex, -1);
        for(String t : tokens) {
            System.out.println("> "+t);
        }
    }
}

其结果与第一个示例相同。

编辑
正如@MikeFHay在评论中提到的:

我更喜欢使用Guava的Splitter,因为它的默认值更合理(请参见上面有关用修饰的空匹配的讨论String#split(),所以我这样做了:

Splitter.on(Pattern.compile(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"))


 类似资料:
  • 问题内容: 我有这样一个字符串: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。 上面的字符串应分为: 问题答案: 可以使用正则表达式 输出:

  • 问题内容: 我有一个像这样的字符串: 上面的字符串应分为: 问题答案: 我认为最简单的解决方案是处理输入字符串char-by-char: 例: 作为免费赠品,此解决方案还根据需要计算嵌套括号: 它还检查括号是否平衡(每个开放的括号都有相应的结束符)。

  • 输入字符串用逗号分隔。但它可能包含双引号内的逗号,需要忽略。下面是示例字符串 下面是我用来拆分逗号的代码,但如果逗号是双引号中字符串的一部分,它就会失败。 所以任何解决这个问题的想法。

  • 问题内容: 我有一些输入如下所示: 逗号分隔的值可以是任何顺序。我想用逗号分割字符串;但是,在双引号内包含某些内容的情况下,我需要它既忽略逗号又去除引号(如果可能)。因此,基本上,输出将是以下字符串列表: 我已经看过其他一些答案,并且我认为正则表达式是最好的,但是我想出这些答案很糟糕。 问题答案: 拉瑟是对的。这是一个逗号分隔的值文件,因此您应该使用module。一个简单的例子:

  • 问题内容: 我正在寻找将其转换为6个元素的数组:a,b,c,“ d,e,f”,g,h。我正在尝试通过Javascript执行此操作。这是我到目前为止所拥有的: 但是现在,它会将双引号中的所有内容都分割开了,这是不正确的。 编辑:好的,抱歉,我对这个问题的措辞很差。给我一个字符串而不是数组。 我想使用“ split”功能将 其 转换为数组。 问题答案: 这就是我要做的。

  • 问题内容: 我有一个长度未知的字符串,看起来像这样 将这些字符串用逗号分隔的最佳方法是什么,以便每个单词都可以成为的元素? 例如 问题答案: 你可以这样做: 基本上,该方法将根据你正在传递的(在这种情况下)定界符来分割字符串,并将返回字符串数组。 但是,你似乎位于字符串列表而不是数组之后,因此必须使用该实用程序将数组转换为列表。就像供你参考一样,你也可以这样做: 但是通常最好是对接口进行编程,而不