Cómo dividir la cadena "Thequickbrownfoxjumps"
en subcadenas de igual tamaño en Java. P.ej. "Thequickbrownfoxjumps"
de 4 de igual tamaño debería dar la salida.
["Theq","uick","brow","nfox","jump","s"]
Pregunta similar:
Cómo dividir la cadena "Thequickbrownfoxjumps"
en subcadenas de igual tamaño en Java. P.ej. "Thequickbrownfoxjumps"
de 4 de igual tamaño debería dar la salida.
["Theq","uick","brow","nfox","jump","s"]
Pregunta similar:
Respuestas:
Aquí está la versión de una sola línea regex:
\G
es una aserción de ancho cero que coincide con la posición donde terminó la coincidencia anterior. Si no hubo una coincidencia previa, coincide con el comienzo de la entrada, igual que\A
. La mirada de retrospectiva adjunta coincide con la posición de cuatro caracteres desde el final de la última coincidencia.Ambos miran hacia atrás y
\G
son características avanzadas de expresiones regulares, no compatibles con todos los sabores. Además,\G
no se implementa de manera consistente en todos los sabores que lo admiten. Este truco funcionará (por ejemplo) en Java , Perl, .NET y JGSoft, pero no en PHP (PCRE), Ruby 1.9+ o TextMate (ambos Oniguruma). JavaScript/y
(bandera adhesiva) no es tan flexible como\G
, y no podría usarse de esta manera, incluso si JS admitiera mirar hacia atrás.Debo mencionar que no necesariamente recomiendo esta solución si tiene otras opciones. Las soluciones que no son expresiones regulares en las otras respuestas pueden ser más largas, pero también se documentan por sí mismas; este es casi lo contrario de eso. ;)
Además, esto no funciona en Android, que no admite el uso de
\G
lookbehinds.fuente
String.substring()
lugar de una expresión regular, mientras se requieren algunas líneas de código adicionales, se ejecutará en algún lugar del orden de 5 veces más rápido ...(?s)
en la expresión regular:(?s)(?<=\\G.{4})
.java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length
Bueno, es bastante fácil hacer esto con operaciones aritméticas y de cadena simples:
No creo que realmente valga la pena usar una expresión regular para esto.
EDITAR: Mi razonamiento para no usar una expresión regular:
fuente
Splitter.fixedLength(4)
como lo sugiere Seanizer.Esto es muy fácil con Google Guava :
Salida:
O si necesita el resultado como una matriz, puede usar este código:
Referencia:
Splitter.fixedLength()
Splitter.split()
Iterables.toArray()
Nota: la construcción del divisor se muestra en línea arriba, pero dado que los divisores son inmutables y reutilizables, es una buena práctica almacenarlos en constantes:
fuente
String.join(separator, arrayOrCollection)
Si está utilizando las bibliotecas de propósito general de guayaba de Google (y, sinceramente, cualquier nuevo proyecto Java probablemente debería serlo), esto es increíblemente trivial con la clase Splitter :
y eso es lo . Tan fácil como!
fuente
fuente
src.length()
y s, su llamada no está logrando lo que desea, vea cómo algunas de las otras respuestas lo están haciendo: (src.length () + len - 1) / lenlen
int
ceiling
fuente
for
bucles?for
bucle es, de hecho, una opción de uso más 'natural' para esto :-) Gracias por señalar esto.Puede usar
substring
desdeString.class
(manejo de excepciones) o desde Apache lang commons (maneja excepciones por usted)Ponlo dentro de un bucle y listo.
fuente
substring
método en laString
clase estándar ?Prefiero esta solución simple:
fuente
substring
implementación cambió con Java 7, actualización 6 a mediados de 2012, cuando los camposoffset
ycount
se eliminaron de laString
clase. Por lo tanto, la complejidad sesubstring
volvió lineal mucho antes de que se hiciera esta respuesta. Pero para una cadena pequeña como el ejemplo, todavía se ejecuta lo suficientemente rápido y para cadenas más largas ... bueno, esta tarea rara vez ocurre en la práctica.Aquí hay una implementación de una línea utilizando flujos Java8:
Da el siguiente resultado:
fuente
String[] result = IntStream.range(0, (input.length()+3)/4) .mapToObj(i -> input.substring(i *= 4, Math.min(i + 4, input.length()))) .toArray(String[]::new);
Aquí hay una versión de una línea que utiliza Java 8 IntStream para determinar los índices de los inicios de la porción:
fuente
En caso de que quiera dividir la cadena igualmente hacia atrás, es decir, de derecha a izquierda, por ejemplo, para dividir
1010001111
a[10, 1000, 1111]
, aquí está el código:fuente
Yo uso la siguiente solución de Java 8:
fuente
Solución Java 8 (como esta pero un poco más simple):
fuente
Le pregunté a @Alan Moore en un comentario a la solución aceptada cómo se podían manejar las cadenas con líneas nuevas. Sugirió usar DOTALL.
Usando su sugerencia, creé una pequeña muestra de cómo funciona:
Pero también me gusta la solución @Jon Skeets en https://stackoverflow.com/a/3760193/1237974 . Para el mantenimiento en proyectos más grandes donde no todos tienen la misma experiencia en expresiones regulares, probablemente usaría la solución Jons.
fuente
Otra solución de fuerza bruta podría ser,
Donde el código solo atraviesa la cadena con subcadenas
fuente
Resultado
fuente
fuente
Aquí está mi versión basada en transmisiones RegEx y Java 8. Vale la pena mencionar que el
Matcher.results()
método está disponible desde Java 9.Prueba incluida.
fuente
fuente
fuente