Зачем String.split необходимо экранировать разделитель трубы - PullRequest
140 голосов
/ 21 марта 2012

Я пытаюсь проанализировать файл, каждая строка которого содержит значения, разделенные каналом. Он не работал правильно, когда я не избежал разделителя канала в методе 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()?

Ответы [ 3 ]

175 голосов
/ 21 марта 2012

String.split ожидает аргумент регулярного выражения. Неэкранированный | анализируется как регулярное выражение, означающее «пустая строка или пустая строка», что не соответствует вашим ожиданиям.

76 голосов
/ 21 марта 2012

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

6 голосов
/ 07 декабря 2015

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

String[] arrayString = yourString.split("\\|");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...