2015-04-21 3 views
8

Я хочу, чтобы разбить строку точкой с запятой («;»):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]); 

Но это снимает «;» из строки и помещает всю строку 'datesplit 1' поэтому выход есть:

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

Demo

и делать

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

строка напечатанных

Real String :‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid 
+11

Ваша фраза «фраза» неверно отформатирована. Покажите нам фактический код, и мы можем помочь. – vdwijngaert

+0

, когда вы разделяете любой символ, этот символ не будет частью вашего массива. Здесь, если вы хотите ';' то вы должны добавить вручную после dateSplit [0] + ";" – Pratik

+1

Здесь я чувствую запах возможной проблемы с кодировкой. – Palcente

ответ

10

phrase содержит bi-directional charactersright-to-left embedding. Поэтому некоторые редакторы не могут правильно отобразить строку.

Этот фрагмент кода показывает фактические символы в 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^^ < - -> Barcelona^^ < - -> VS.^^< - -> Real^^ < - -> Мадрид

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

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

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

1

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

Demo

+1

Это не строка OP, размещенная – Palcente

+1

Есть некоторые скрытые символы в строке, которые OP размещены – Prashant

+0

@Palcente, О, я вижу, я думал, что OP пытается с этим текстом, который виден в вопросе. –

0

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

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

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

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

+2

Вы говорите: * «Однако я бы рекомендовал использовать StringTokenizer вместо этого. Затем вы можете перебрать его, что приведет к более приятному (и безопасному) коду.» *, [JavaDoc] (https://docs.oracle.com/ JavaSE/7/документы/API/Java/Util/StringTokenizer.html): * «StringTokenizer - это унаследованный класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы каждый, кто ищет эту функцию, использовал метод split для String или пакет java.util.regex. «*. Что должен знать кто-то новый для Java? : P – Tom

+0

@Tom hmm, не заметил этого, возможно, потому, что он не был аннотирован как устаревший (также, я не могу вспомнить последний раз, когда я действительно использовал StringTokenizer). Хорошо знать. –

Смежные вопросы