Dividir una cuerda, en cada enésima posición

Uso esta expresión regular para dividir una cadena en cada posición 3ª:

String []thisCombo2 = thisCombo.split("(?<=\\G...)"); 

donde los 3 puntos después de la G indican cada enésima posición para dividir. En este caso, los 3 puntos indican cada 3 posiciones. Un ejemplo:

 Input: String st = "123124125134135145234235245" Output: 123 124 125 134 135 145 234 235 245. 

Mi pregunta es, ¿cómo dejo que el usuario controle la cantidad de posiciones donde debe dividirse la cadena? En otras palabras, ¿cómo hago esos 3 puntos, n puntos controlados por el usuario?

Para una gran mejora de rendimiento, una alternativa sería utilizar substring() en un bucle:

 public String[] splitStringEvery(String s, int interval) { int arrayLength = (int) Math.ceil(((s.length() / (double)interval))); String[] result = new String[arrayLength]; int j = 0; int lastIndex = result.length - 1; for (int i = 0; i < lastIndex; i++) { result[i] = s.substring(j, j + interval); j += interval; } //Add the last bit result[lastIndex] = s.substring(j); return result; } 

Ejemplo:

 Input: String st = "1231241251341351452342352456" Output: 123 124 125 134 135 145 234 235 245 6. 

No es tan breve como la solución de stevevls , pero es mucho más eficiente (ver más abajo) y creo que sería más fácil ajustarlo en el futuro, por supuesto, dependiendo de su situación.


Pruebas de rendimiento (Java 7u45)

Cadena larga de 2.000 caracteres: el intervalo es 3 .

split("(?< =\\G.{" + count + "})") rendimiento (en milisegundos):

 7, 7, 5, 5, 4, 3, 3, 2, 2, 2 

splitStringEvery() ( splitStringEvery() ) (en milisegundos):

 2, 0, 0, 0, 0, 1, 0, 1, 0, 0 

Cadena larga de 2.000.000 caracteres: el intervalo es 3 .

rendimiento de split() (en milisegundos):

 207, 95, 376, 87, 97, 83, 83, 82, 81, 83 

splitStringEvery() (en milisegundos):

 44, 20, 13, 24, 13, 26, 12, 38, 12, 13 

Cadena de 2.000.000 caracteres de largo: el intervalo es 30 .

rendimiento de split() (en milisegundos):

 103, 61, 41, 55, 43, 44, 49, 47, 47, 45 

splitStringEvery() (en milisegundos):

 7, 7, 2, 5, 1, 3, 4, 4, 2, 1 

Conclusión:

El método splitStringEvery() es mucho más rápido (incluso después de los cambios en Java 7u6 ), y se intensifica cuando los intervalos se vuelven más altos .

Código de prueba listo para usar:

pastebin.com/QMPgLbG9

Puede utilizar el operador de llave para especificar el número de veces que debe aparecer un carácter:

 String []thisCombo2 = thisCombo.split("(?< =\\G.{" + count + "})"); 

El corsé es una herramienta útil porque puede usarlo para especificar un recuento exacto o rangos.

Con Google Guava , puede usar Splitter.fixedLength ()

Devuelve un divisor que divide las cadenas en piezas de la longitud dada

 Splitter.fixedLength(2).split("abcde"); // returns an iterable containing ["ab", "cd", "e"]. 

Si desea construir esa cadena de expresiones regulares, puede establecer la longitud de división como un parámetro.

 public String getRegex(int splitLength) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < splitLength; i++) builder.append("."); return "(?<=\\G" + builder.toString() +")"; } 
 private String[] StringSpliter(String OriginalString) { String newString = ""; for (String s: OriginalString.split("(?< =\\G.{"nth position"})")) { if(s.length()<3) newString += s +"/"; else newString += StringSpliter(s) ; } return newString.split("/"); }