使用split("|")通过竖杠符号分割Java字符串

210

Java官方文档中说明:

例如,字符串"boo:and:foo"在使用下列表达式时产生以下结果:

正则表达式 结果

{ "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<
为什么会发生这种情况?

2
可能是如何在Java中拆分字符串的重复问题。 - KIBOU Hassan
7个回答

454
你需要:
test.split("\\|");

split 使用正则表达式,而在 regex 中,| 是一个元字符,代表着逻辑运算的 OR 操作符。你需要使用 \ 转义该字符(在字符串中写作 "\\",因为 \ 也是字符串字面量中的元字符,需要再次转义)。

你也可以使用

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

并让Pattern.quote创建表示|的正则表达式的转义版本。

17
split()方法接受正则表达式作为参数,其中|是正则表达式的特殊字符。 - jmj
1
你是我在 Stack Overflow 上的第二选择作为版主。祝一切顺利。 - Däñish Shärmà

42

使用正确的转义: string.split("\\|")

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

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

它适用于任意输入字符串。在需要引用/转义用户输入时非常有用。


3
不确定何时进行了转换,但在Java 8中,人们会使用Pattern.quote() - randers

6
请使用以下代码:
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, "|");

2

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

(我用这个代替了.split("\\|"),因为后者对我没起作用。)


两个版本都应该可以正常工作。如果一个版本不能正常工作,那么问题可能出在其他地方。 - Pshemo
@Pshemo,这确实增加了一些有趣的味道,如果将某些保留符号放在括号内,则不必转义。 - Pax Vobiscum

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

指定限制或最大值对于像“boo|||a”、“||boo|”或“ |||”这样的示例将是准确的

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

使用参考:link


-2

split() 方法接受一个正则表达式作为参数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接