在Java中分割字符串

3
当我使用 String.split("|") 来分割字符串 "1|2|3|4" 时,数组中会得到8个元素而不是4个。如果我使用 "\\|" 则结果正确。我猜测这与正则表达式有关。有人可以解释一下吗?

只是指出一下——这种混淆所花费的时间可能比你在整个职业生涯中通过使用正则表达式(而不是编写该死的代码)节省的时间还要多,除非你经常进行大量的Shell脚本编程。 - Bill K
1
我从未打算使用正则表达式,可是该死的 API 却在自动使用,那我现在该怎么办呢? - why should I tell you my name
1
不幸的是,String.split() 方法总是使用正则表达式。虽然有更灵活的 API 可用。 - ColinD
3个回答

7
你说得对。 | 是一个用于备选项的特殊字符。正则表达式中的 | 表示“空字符串或空字符串”,因此它将在所有空字符串周围拆分,每个字符将产生1个元素。用 \| 转义它会使其变成普通字符。

谢谢回复。&和&也是特殊字符吗? - why should I tell you my name
@why:不是的。请参见http://download-llnw.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html。您可以使用`\Q...\E`确保`...`不会被解释为特殊字符。 - kennytm
@为什么我要告诉你我的名字:http://www.regular-expressions.info/reference.html - ColinD

3
如果您想在不使用正则表达式的情况下拆分字符串,我建议使用Guava中的Splitter类。它可以按固定字符串、正则表达式等方式进行拆分。
Iterable<String> split = Splitter.on('|').split("1|2|3|4");

1

| 在 Java 正则表达式语法中表示 OR,基本上用 | 分割 1|2|3|4 等同于告诉 String#split() "在空的 OR 空的之间分割这个字符串",这意味着它会在原始字符串中的每个字符后进行分割。


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