2015-10-12 4 views
-2

У меня есть строка, как «3332255766122», который я хочу иметь в массиве, как это: 333,22,55,7,66,1,22Java String.split() без специального символа

Итак, Строка должна быть разделена по частям, когда появляется новый символ. Это возможно?

Мой нынешний подход состоял в том, чтобы проверить письмо, а затем проверить следующий, и если они равны, проверьте также следующий и т. Д., Если они не равны, предыдущие равные числа добавляются в список.

+8

Да. Возможное. Любая попытка? –

+0

Пока нет, обычно я использовал String.Split(), но там я должен добавить параметр, который символизирует делиметр, которого у меня нет. – Marcel

+2

вам нужно будет создать свой собственный метод. это не так сложно. – Stultuske

ответ

7

Вы можете сделать это с помощью split() и некоторых регулярных выражений магии:

System.out.println(Arrays.toString("3332255766122".split("(?<=(.))(?!\\1)"))); 

Выход:

[333, 22, 55, 7, 66, 1, 22] 

Regex пробоя:

  • (?<=x) положительный нулевой ширины look- позади, поэтому он будет соответствовать позиции сразу после матча для подвыражения x
  • (.) как epxression для x выше - группа захвата, которая соответствует любому символу и фиксирует ее для следующего шага. В сочетании с приведенной выше частью, то есть (?<=(.)) это означает: «соответствовать любой позиции после символа и захватывать этот символ в группу»
  • (?!x) - это негативный прогноз, который соответствует любой позиции, за которой не следует соответствие подвыражения x.
  • \1 является обратной ссылкой на матч первого захвата группы ((.) в данном случае), так что в сочетании с указанной выше части, т.е. (?!\1), это соответствует какой-либо позиции, которая не соответствует символ перед

В словах выражение будет означать: «соответствовать любой позиции после любого символа, за которым не следует один и тот же символ».

+0

Не могли бы вы объяснить regex pls? –

+0

@MuratK Я уже работаю над этим :) – Thomas

+0

@ MuratK.это должно помочь http://www.regular-expressions.info/lookaround.html http://www.regular-expressions.info/backref.html – Pshemo

5

Это может работать для вас:

public static void main(String... args) throws Exception { 
     String s = "3332255766122"; 
     Pattern p = Pattern.compile("(\\d)\\1*"); 
     Matcher m = p.matcher(s); 
     while(m.find()) { 
      System.out.println(m.group()); 
     }  
    } 

O/P:

333 
22 
55 
7 
66 
1 
22 

PS: Я думаю, что решение Томаса лучше :)

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