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

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<

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

bluehallu
источник
2
Возможный дубликат Как разбить строку в Java
KIBOU Hassan

Ответы:

424

Тебе нужно

test.split("\\|");

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

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

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

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

Джигар Джоши
источник
17
Это split()метод принимает регулярное выражение и |является специальным символом для рег экс
Джигар Джоши
1
Вы мой второй выбор в качестве модератора переполнения стека. Всего наилучшего.
Даниш Шарма
33

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

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

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

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

Аарон Дигулла
источник
3
Не уверен, когда переход был сделан, но в Java 8 можно было бы использовать Pattern.quote().
RAnders00
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 + "<");
    }
}
berliandi
источник
Это решение уже указано принятым ответом. Не нужно повторять это.
Пшемо
3

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

StringUtils.split(test, "|");
Саймон
источник
1

Вы также можете использовать .split("[|]") .

(Я использовал это вместо .split("\\|"), что не работает для меня.)

Homer
источник
Обе версии должны работать нормально. Если это не так, это говорит о том, что проблема в другом месте.
Пшемо
@Pshemo Это, однако, добавляет интересный вкус, что некоторые зарезервированные символы не должны быть экранированы, если заключены в квадратные скобки.
Pax
0
test.split("\\|",999);

Указание лимита или максимума будет точным для примеров, таких как: "boo ||| a" или "|| boo |" или "|||"

Но test.split("\\|");вернет массивы строк разной длины для тех же примеров.

используйте ссылку: ссылка

Райан Августин
источник
-2

метод split () принимает регулярное выражение в качестве аргумента

штормовой
источник