Dividir una cadena en cada n-ésimo personaje

En JavaScript, así es como podemos dividir una cadena en cada 3er personaje

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

Estoy intentando descubrir cómo hacer esto en Java. ¿Alguna sugerencia?

Podrías hacerlo así:

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

que produce:

 [123, 456, 789, 0] 

La expresión regular (?< =\G...) coincide con una cadena vacía que tiene la última coincidencia ( \G ) seguida de tres caracteres ( ... ) antes de ella ( (?< = ) )

Java no proporciona utilidades de división con todas las funciones, por lo que las bibliotecas de Guava :

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

Vea el Javadoc para Splitter ; es muy 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 una adición a la respuesta de Bart Kiers , quiero agregar que es posible en lugar de usar los tres puntos ... en la expresión de expresiones regulares que representan tres caracteres que puedes escribir .{3} que tiene el mismo significado.

Entonces el código se vería así:

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

Con esto, sería más fácil modificar la longitud de la cadena y la creación de una función ahora es razonable con una longitud de cadena de entrada variable. Esto podría hacerse de la siguiente manera:

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

Un ejemplo en IdeOne: http://ideone.com/rNlTj5

Entrada tardía.

Lo que sigue es una implementación sucinta usando flujos Java8, un trazador de líneas:

 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(); 

Salida:

 [foo, bar, spa, m] 

Esta es una respuesta tardía, pero la expongo de todos modos para que los nuevos progtwigdores puedan verla:

Si no desea utilizar expresiones regulares, y no desea confiar en una biblioteca de terceros, puede utilizar este método, que lleva entre 89920 y 100113 nanosegundos en una CPU de 2,80 GHz (menos de un milisegundo). No es tan bonito como el ejemplo de Simon Nickerson, pero 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()]); }