Разделение строки с символом трубы в качестве разделителя

Почему в следующем случае вывод [], а не [1]?

String input="1|2|3";
String[] values= input.split("|");
System.out.println("[" + values[0] + "]");
// Output: []

Однако, если мы изменим разделитель, выход будет [1].

String input="1;2;3";
String[] values= input.split(";");
System.out.println("[" + values[0] + "]");
// Output: [1]

Ответ 1

Попробуйте избежать этого символа:

String input="1|2|3";
String[] values= input.split("\\|");
System.out.println("[" + values[0] + "]");

Ответ 2

Потому что | имеет особое значение в регулярных выражениях. Вам нужно сбежать следующим образом: \|, а на Java вам также придется скрывать обратную косую черту, чтобы вы закончили с \\|

Символ трубы является оператором дизъюнкции, что означает, что он указывает механизму регулярных выражений выбрать любой шаблон слева и справа от него. В вашем случае те, где пустые строки, которые соответствуют чему-либо.

Ответ 3

Метод split получает в качестве параметра регулярное выражение. Труба является зарезервированным персонажем с его собственной целью (это означает or).

Вы можете либо сбежать от него ("\\|"), либо, если вы используете Java 1.5+, вы можете использовать Pattern.quote("|") следующим образом:

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

Ответ 4

Попробуйте использовать \\| вместо |, когда вы раскалываете его, чтобы избежать его.

Итак, ваш код изменится на:

String input="1|2|3";
String[] values= input.split("\\|");
System.out.println("[" + values[0] + "]");

Ответ 5

вам нужно избежать символа '|' правильно

String input="1|2|3";
        String[] values= input.split("\\|");
        System.out.println("[" + values[0] + "]");

Ответ 6

Символ трубы эквивалентен логическому или регулярному выражению. Если вы действительно хотите использовать символ pipe как разделитель, вам нужно избежать его с помощью \, как в

String[] values= input.split("\|");