Почему String.split требует, чтобы разделитель строк был экранирован?

Я пытаюсь разобрать файл, в котором есть каждая строка с значениями, разделенными на канал. Это не сработало, когда я не вышел из разделителя труб в режиме разделения, но он работал правильно после того, как я сбежал из трубы, как показано ниже.

private ArrayList<String> parseLine(String line) {
    ArrayList<String> list = new ArrayList<String>();
    String[] list_str = line.split("\\|"); // note the escape "\\" here
    System.out.println(list_str.length);
    System.out.println(line);
    for(String s:list_str) {
        list.add(s);
        System.out.print(s+ "|");
    }
    return list;
}

Может кто-нибудь объяснить, почему символ канала должен быть экранирован для метода split()?

Ответ 1

String.split ожидает аргумент регулярного выражения. Unescaped | анализируется как регулярное выражение, означающее "пустая строка или пустая строка", что не означает, что вы имеете в виду.

Ответ 2

Поскольку синтаксис этого параметра split является регулярным выражением, где в '|' имеет особое значение OR, а '\ |' означает буквальный '|' поэтому строка "\\ |" означает регулярное выражение '\ |' что означает совпадение с символом "|".

Ответ 3

Вы можете просто сделать это:

String[] arrayString = yourString.split("\\|");