使用split(“ |”)通过管道符号分割Java字符串


195

Java官方文档指出:

"boo:and:foo"例如,字符串使用这些表达式Regex Result产生以下结果:

{ "boo", "and", "foo" }"

这就是我需要它工作的方式。但是,如果我运行此命令:

public static void main(String[] args){
        String test = "A|B|C||D";

        String[] result = test.split("|");

        for(String s : result){
            System.out.println(">"+s+"<");
        }
    }

它打印:

><
>A<
>|<
>B<
>|<
>C<
>|<
>|<
>D<

这与我的预期相去甚远:

>A<
>B<
>C<
><
>D<

为什么会这样呢?


Answers:


423

你需要

test.split("\\|");

split使用正则表达式,并且在regex中 |是表示OR运算符的元字符。您需要使用对该字符进行转义\(使用String编写,"\\"因为\它也是String文字中的元字符,并且需要另一个字符对其\进行转义)。

您也可以使用

test.split(Pattern.quote("|"));

Pattern.quote创建代表的正则表达式的转义版本|


17
是,split()方法采用regex,并且|是reg ex的特殊字符
Jigar Joshi

1
您是我作为堆栈溢出主持人的第二选择。祝一切顺利。
丹麦夏尔马

33

使用适当的转义: string.split("\\|")

或者,在Java 5+中,使用Pattern.quote()为此目的而创建的帮助程序:

string.split(Pattern.quote("|"))

与任意输入字符串一起使用。当您需要引用/转义用户输入时非常有用。


3
进行过渡时并不确定,但是在Java 8中,可以使用Pattern.quote()
RAnders00 '16

4

使用此代码:

public static void main(String[] args) {
    String test = "A|B|C||D";

    String[] result = test.split("\\|");

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}

该解决方案已经由公认的答案指出。无需重复。
Pshemo

3

您还可以使用apache库并执行以下操作:

StringUtils.split(test, "|");

1

您也可以使用.split("[|]")

(我用它代替.split("\\|"),对我不起作用。)


两种版本都可以正常工作。如果不是,则表明问题出在其他地方。
Pshemo

@Pshemo但是,这确实增加了一种有趣的味道,如果放在方括号内,则不必保留某些保留的符号。
Pax Vobiscum

0
test.split("\\|",999);

例如,指定限值或最大值将是准确的:“ boo ||| a”或“ || boo |” 或“ |||”

但是 test.split("\\|");对于相同的示例,将返回不同长度的字符串数组。

使用参考:链接


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.