Строковый разделитель в методе 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);
не дает требуемого результата.
Ответы
Ответ 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("\\|\\|");