Разделитель строк в методе string.split - PullRequest
41 голосов
/ 11 августа 2011

У меня есть следующие данные:

1||1||Abdul-Jabbar||Karim||1996||1974

Я хочу разграничить токены.

Здесь разделитель "||".

Мой установщик разделителя:

public void setDelimiter(String delimiter) {
    char[] c = delimiter.toCharArray();
    this.delimiter = "\"" + "\\" + c[0] + "\\" + c[1] + "\"";
    System.out.println("Delimiter string is: " + this.delimiter);
}

Однако

String[] tokens = line.split(delimiter);

не дает требуемого результата.

Ответы [ 10 ]

54 голосов
/ 11 августа 2011

Нет необходимости устанавливать разделитель, разбивая его на части, как вы сделали.

Вот полная программа, которую вы можете скомпилировать и запустить:

import java.util.Arrays;
public class SplitExample {
    public static final String PLAYER = "1||1||Abdul-Jabbar||Karim||1996||1974";
    public static void main(String[] args) {
        String[] data = PLAYER.split("\\|\\|");
        System.out.println(Arrays.toString(data));
    }
}

Если выЕсли вы хотите использовать расщепление с шаблоном, вы можете использовать Pattern.compile или Pattern.quote.

Чтобы увидеть compile и quote в действии, вот пример использования всех трех подходов:

import java.util.Arrays;
import java.util.regex.Pattern;
public class SplitExample {
    public static final String PLAYER = "1||1||Abdul-Jabbar||Karim||1996||1974";
    public static void main(String[] args) {
        String[] data = PLAYER.split("\\|\\|");
        System.out.println(Arrays.toString(data));

        Pattern pattern = Pattern.compile("\\|\\|");
        data = pattern.split(PLAYER);
        System.out.println(Arrays.toString(data));

        pattern = Pattern.compile(Pattern.quote("||"));
        data = pattern.split(PLAYER);
        System.out.println(Arrays.toString(data));
    }
}

Рекомендуется использовать шаблоны, если вы собираетесь часто разбивать, используя один и тот же шаблон.Кстати, вывод:

[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
33 голосов
/ 11 августа 2011

Используйте метод Pattern#quote() для экранирования ||.Попробуйте:

final String[] tokens = myString.split(Pattern.quote("||"));

Это необходимо, поскольку | является символом чередования и, следовательно, приобретает особое значение при передаче в вызов split (в основном аргумент для splitрегулярное выражение в виде строки).

8 голосов
/ 11 августа 2011

Двойные кавычки интерпретируются как литералы в регулярных выражениях; они не специальные символы. Вы пытаетесь сопоставить литерал "||".

Просто используйте Pattern.quote(delimiter):

По запросу, вот строка кода (такая же, как у Санджея)

final String[] tokens = line.split(Pattern.quote(delimiter));

Если это не сработает, вы не указали правильный разделитель.

6 голосов
/ 24 декабря 2015
String[] strArray= str.split(Pattern.quote("||"));

где

  1. str = "1 || 1 || Абдул-Джаббар || Карим || 1996 || 1974";
  2. Pattern.quote ("|| ") будет игнорировать специальный символ.
  3. .split функция будет разбивать строку для каждого вхождения ||.
  4. strArray будет иметь массив строк, который ограничен ||.
5 голосов
/ 11 августа 2011

Трубка (|) - это специальный символ в регулярном выражении. чтобы избежать этого, нужно поставить перед ним обратную косую черту (\). Но в Java обратная косая черта также является escape-символом. так что вам снова нужно избежать еще одного обратного слэша. Таким образом, ваше регулярное выражение должно быть \\|\\| например, String[] tokens = myString.split("\\|\\|");

2 голосов
/ 24 декабря 2015

В Split используется регулярное выражение, а символ "труба" | имеет специальное значение в регулярном выражении, поэтому вам нужно его избежать. Есть несколько способов сделать это, но вот самый простой:

String[] tokens = line.split("\\|\\|");
0 голосов
/ 25 июня 2015
StringTokenizer st = new StringTokenizer("1||1||Abdul-Jabbar||Karim||1996||1974",
             "||");
while(st.hasMoreTokens()){
     System.out.println(st.nextElement());
}

Ответ напечатает

1 1 Абдул-Джаббар Карим 1996 1974

0 голосов
/ 13 апреля 2014
String[] splitArray = subjectString.split("\\|\\|");

Вы используете функцию:

public String[] stringSplit(String string){

    String[] splitArray = string.split("\\|\\|");
    return splitArray;
}
0 голосов
/ 11 августа 2011

Проблема в том, что вы добавляете кавычки в разделитель.Он должен быть удален, и он будет работать нормально.

public void setDelimiter(String delimiter) {
    char[] c = delimiter.toCharArray();
    this.delimiter = "\\" + c[0] + "\\" + c[1];
    System.out.println("Delimiter string is: " + this.delimiter);
}
0 голосов
/ 11 августа 2011

В вашей функции setDelimiter() что-то не так. Вы же не хотите ставить двойные кавычки, не так ли?

public void setDelimiter(String delimiter) {
    char[] c = delimiter.toCharArray();
    this.delimiter = "\\" + c[0] + "\\" + c[1];
    System.out.println("Delimiter string is: " + this.delimiter);
}

Однако, как говорили другие пользователи, лучше использовать метод Pattern.quote (), чтобы экранировать разделитель, если ваши требования позволяют.

...