Вопрос-ответ

Splitting a Java String by the pipe symbol using split("|")

Разделение строки Java по символу канала с помощью split ("|")

Официальная документация 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<

Почему это происходит?

Переведено автоматически
Ответ 1

Вам нужно

test.split("\\|");

split использует регулярное выражение и в регулярном выражении | является метасимволом, представляющим OR оператор. Вам нужно экранировать этот символ с помощью \ (записывается в String как "\\" поскольку \ также является метасимволом в строковых литералах, и для экранирования требуется другой \).

Вы также можете использовать

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

и давайте Pattern.quote создадим экранированную версию регулярного выражения, представляющего |.

Ответ 2

Используйте правильное экранирование: string.split("\\|")

Или, в Java 5+, используйте помощник Pattern.quote(), который был создан именно для этой цели:

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

который работает с произвольными строками ввода. Очень полезно, когда вам нужно заключить пользовательский ввод в кавычки / экранировать его.

Ответ 3

Используйте этот код:

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

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

for (String s : result) {
System.out.println(">" + s + "<");
}
}
Ответ 4

Вы также можете использовать библиотеку apache и сделать это:

StringUtils.split(test, "|");
java regex string