Подтвердить что ты не робот

Строковый разделитель в методе string.split

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

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);

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

4b9b3361

Ответ 1

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

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

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));
    }
}

Если вы хотите использовать split с шаблоном, вы можете использовать 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));
    }
}

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

[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]

Ответ 2

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

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

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

Ответ 3

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

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

В соответствии с запросом здесь строка кода (такая же, как у Санджая)

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

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

Ответ 4

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

Ответ 5

String[] strArray= str.split(Pattern.quote("||"));

где

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

String[] splitArray = subjectString.split("\\|\\|");

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

public String[] stringSplit(String string){

    String[] splitArray = string.split("\\|\\|");
    return splitArray;
}

Ответ 9

StringTokenizer st = new StringTokenizer("1||1||Abdul-Jabbar||Karim||1996||1974",
             "||");
while(st.hasMoreTokens()){
     System.out.println(st.nextElement());
}

Ответ будет напечатан

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

Ответ 10

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

String[] tokens = line.split("\\|\\|");