Dividindo uma string a cada n-ésimo caractere

Em JavaScript, é assim que podemos dividir uma string em cada terceiro caracter.

"foobarspam".match(/.{1,3}/g) 

Eu estou tentando descobrir como fazer isso em Java. Alguma ponteira?

Você poderia fazer assim:

 String s = "1234567890"; System.out.println(java.util.Arrays.toString(s.split("(?< =\\G...)"))); 

que produz:

 [123, 456, 789, 0] 

O regex (?< =\G...) corresponde a uma cadeia vazia que tem a última correspondência ( \G ) seguida de três caracteres ( ... ) antes dela ( (?< = ) )

O Java não fornece utilitários de divisão com resources completos, portanto, as bibliotecas do Guava fazem:

 Iterable pieces = Splitter.fixedLength(3).split(string); 

Confira o Javadoc para Splitter ; é muito poderoso.

 import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { for (String part : getParts("foobarspam", 3)) { System.out.println(part); } } private static List getParts(String string, int partitionSize) { List parts = new ArrayList(); int len = string.length(); for (int i=0; i 

Como complemento à resposta de Bart Kiers , quero acrescentar que é possível, em vez de usar os três pontos ... na expressão regex, que representam três caracteres que você pode escrever .{3} que tem o mesmo significado.

Então o código ficaria parecido com o seguinte:

 String bitstream = "00101010001001010100101010100101010101001010100001010101010010101"; System.out.println(java.util.Arrays.toString(bitstream.split("(?< =\\G.{3})"))); 

Com isso, seria mais fácil modificar o comprimento da string e a criação de uma function agora é razoável com um comprimento de string de input variável. Isso pode ser feito da seguinte forma:

 public static String[] splitAfterNChars(String input, int splitLen){ return input.split(String.format("(?< =\\G.{%1$d})", splitLen)); } 

Um exemplo no IdeOne: http://ideone.com/rNlTj5

Entrada tardia.

A seguir, uma implementação sucinta usando streams Java8, um liner:

 String foobarspam = "foobarspam"; AtomicInteger splitCounter = new AtomicInteger(0); Collection splittedStrings = foobarspam .chars() .mapToObj(_char -> String.valueOf((char)_char)) .collect(Collectors.groupingBy(stringChar -> splitCounter.getAndIncrement() / 3 ,Collectors.joining())) .values(); 

Saída:

 [foo, bar, spa, m] 

Esta é uma resposta tardia, mas eu estou colocando para fora de qualquer maneira para qualquer novo programador ver:

Se você não quiser usar expressões regulares e não desejar depender de uma biblioteca de terceiros, poderá usar esse método, o que leva entre 89920 e 100113 nanossegundos em uma CPU de 2,80 GHz (menos que um milissegundo). Não é tão bonito quanto o exemplo de Simon Nickerson, mas funciona:

  /** * Divides the given string into substrings each consisting of the provided * length(s). * * @param string * the string to split. * @param defaultLength * the default length used for any extra substrings. If set to * 0, the last substring will start at the sum of * lengths and end at the end of string. * @param lengths * the lengths of each substring in order. If any substring is not * provided a length, it will use defaultLength. * @return the array of strings computed by splitting this string into the given * substring lengths. */ public static String[] divideString(String string, int defaultLength, int... lengths) { java.util.ArrayList parts = new java.util.ArrayList(); if (lengths.length == 0) { parts.add(string.substring(0, defaultLength)); string = string.substring(defaultLength); while (string.length() > 0) { if (string.length() < defaultLength) { parts.add(string); break; } parts.add(string.substring(0, defaultLength)); string = string.substring(defaultLength); } } else { for (int i = 0, temp; i < lengths.length; i++) { temp = lengths[i]; if (string.length() < temp) { parts.add(string); break; } parts.add(string.substring(0, temp)); string = string.substring(temp); } while (string.length() > 0) { if (string.length() < defaultLength || defaultLength <= 0) { parts.add(string); break; } parts.add(string.substring(0, defaultLength)); string = string.substring(defaultLength); } } return parts.toArray(new String[parts.size()]); }