Me gusta la idea de StringTokenizer porque es Enumerable.
Pero también es obsoleto y se reemplaza por String.split, que devuelve un String aburrido [] (y no incluye los delimitadores).
Así que implementé un StringTokenizerEx que es un Iterable y que requiere una expresión regular verdadera para dividir una cadena.
Una expresión regular verdadera significa que no es una 'secuencia de caracteres' repetida para formar el delimitador:
'o' solo coincidirá con 'o', y dividirá 'ooo' en tres delimitadores, con dos cadenas vacías dentro:
[o], '', [o], '', [o]
Pero la expresión regular o + devolverá el resultado esperado al dividir "aooob"
[], 'a', [ooo], 'b', []
Para usar este StringTokenizerEx:
final StringTokenizerEx aStringTokenizerEx = new StringTokenizerEx("boo:and:foo", "o+");
final String firstDelimiter = aStringTokenizerEx.getDelimiter();
for(String aString: aStringTokenizerEx )
{
// uses the split String detected and memorized in 'aString'
final nextDelimiter = aStringTokenizerEx.getDelimiter();
}
El código de esta clase está disponible en DZone Snippets .
Como es habitual para una respuesta de desafío de código (una clase autónoma con casos de prueba incluidos), cópiela y péguela (en un directorio 'src / test') y ejecútela . Su método main () ilustra los diferentes usos.
Nota: (edición de finales de 2009)
El artículo Reflexiones finales: Java Puzzler: Splitting Hairs hace un buen trabajo explicando el extraño comportamiento en String.split().
Josh Bloch incluso comentó en respuesta a ese artículo:
Sí, esto es un dolor. FWIW, se hizo por una muy buena razón: compatibilidad con Perl.
El tipo que lo hizo es Mike "madbot" McCloskey, quien ahora trabaja con nosotros en Google. Mike se aseguró de que las expresiones regulares de Java pasaran virtualmente cada una de las pruebas de expresión regular de 30K Perl (y corrían más rápido).
La guayaba de la biblioteca común de Google también contiene un divisor que es:
- más simple de usar
- mantenido por Google (y no por usted)
Por lo tanto, puede valer la pena echarle un vistazo. De su documentación preliminar inicial (pdf) :
JDK tiene esto:
String[] pieces = "foo.bar".split("\\.");
Está bien usar esto si quieres exactamente lo que hace: - expresión regular - resultado como una matriz - su forma de manejar piezas vacías
Mini-rompecabezas: ", a ,, b,". Split (",") devuelve ...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
Respuesta: (e) Ninguna de las anteriores.
",a,,b,".split(",")
returns
"", "a", "", "b"
¡Solo se saltan los vacíos finales! (¿Quién conoce la solución para evitar el salto? Es divertido ...)
En cualquier caso, nuestro Splitter es simplemente más flexible: el comportamiento predeterminado es simplista:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
Si desea funciones adicionales, ¡pídalas!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
El orden de los métodos de configuración no importa: durante la división, el recorte ocurre antes de verificar si hay vacíos.