String.split по точкам с запятой

Я хочу разбить строку точкой с запятой ( ";" ):

String phrase = "‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid";
String[] dateSplit = phrase.split(";");
System.out.println("dateSplit[0]:" + dateSplit[0]);
System.out.println("dateSplit[1]:" + dateSplit[1]);

Но он удаляет ";" из строки и помещает всю строку в 'dateplit 1' поэтому выход:

dateSplit[0]:‫
dateSplit[1]:‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid`

Демо

и при выполнении

System.out.println("Real String :"+phrase);

напечатанная строка

Real String :‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid
3 ответа

phrase содержит двунаправленные символы, например право на левое вложение. Это почему некоторые редакторы не могут корректно отобразить строку.

Этот фрагмент кода показывает фактические символы в String (для некоторых людей phrase не будет отображаться здесь правильно, но он компилируется и отлично выглядит в Eclipse). Я просто перевел влево-вправо с , справа налево с < - и поп-направления с ^:

public static void main(String[]args) {
 String phrase = "‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid";
 String[] dateSplit = phrase.split(";");
 for (String d : dateSplit) {
 System.out.println(d);
 }
 char[] c = phrase.toCharArray();
 StringBuilder p = new StringBuilder();
 for (int i = 0; i < c.length;i++) {
 int code = Character.codePointAt(c, i);
 switch (code) {
 case 8234:
 p.append(" -> ");
 break;
 case 8235:
 p.append(" <- ");
 break;
 case 8236:
 p.append(" ^ ");
 break;
 default:
 p.append(c[i]);
 }
 }
 System.out.println(p.toString());
}

Печать

< -; → 14/май/2015 ^ ^ < - → FC ^ ^ & alpha; →> Барселона & bull; ^ ^ < - → Real ^ ^ < - → Мадрид

String#split() будет работать с фактической символьной строкой, а не с тем, что отображает редактор, поэтому вы можете видеть, что ; является вторым символом после справа налево, который дает (остерегайтесь отображения снова: ; не является частью строки в dateSplit[1]):

dateSplit [0] = "; dateSplit [1] =" 14/май/2015 FC Barcelona VS. Real Madrid";

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


I rewrote ваш код вместо того, чтобы справляться с этим и его работа отлично.

public static void main(String[] args) {
 String phrase = "14/May/2015; FC Barcelona VS. Real Madrid";
 String[] dateSplit = phrase.split(";");
 System.out.println("dateSplit[0]:" + dateSplit[0]);
 System.out.println("dateSplit[1]:" + dateSplit[1]);
}

Демо


Вырезать и вставлять ваш код в IntelliJ, прикрутил редактор; как сказал @Palcente, возможные проблемы с кодированием.

Однако я бы рекомендовал использовать StringTokenizer.

StringTokenizer sTok = new StringTokenizer(phrase, ";");

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

licensed under cc by-sa 3.0 with attribution.