2012-04-13 7 views
5

¿Cómo puedo dividir una cadena utilizando String.split() sin tener espacios finales o finales ni valores vacíos?¿Cómo puedo dividir una cadena utilizando String.split() sin tener espacios finales o finales ni valores vacíos?

Digamos que tengo cadena como " [email protected] ; [email protected]; [email protected], [email protected] ".

Solía ​​dividirlo llamando al String.split("[;, ]+") pero el inconveniente es que obtienes elementos de matriz vacíos que debes ignorar en un bucle adicional.

También probé String.split("\\s*[;,]+\\s*") que no da los elementos vacíos, pero deja espacio que conduce en primer correo electrónico y finales espacio en el último correo electrónico de manera que resulta matriz se parece porque no hay comas o punto y coma junto a los correos electrónicos:

[0] = {[email protected]}" [email protected]" 
[1] = {[email protected]}"[email protected]" 
[2] = {[email protected]}"[email protected]" 
[3] = {[email protected]}"[email protected] " 

¿Es posible obtener una serie de correos electrónicos "limpios" usando solo expresiones regulares y Split (sin tener que llamar a String.trim())?

Gracias!

+0

¿Por qué no hacer un String.trim() antes de agregar la cadena a la matriz? – siebz0r

+0

Porque no estoy agregando cadenas a la matriz, 'String.split' sí. – expert

+0

Correcto, mi mal ;-) – siebz0r

Respuesta

5
String input = " [email protected] ; [email protected]; [email protected], [email protected] "; 
input = input.replace(" ", ""); 
String[] emailList = input.split("[;,]+"); 

Supongo que está bastante seguro de que su cadena de entrada no contiene otra cosa que direcciones de correo electrónico y solo necesita recortar/reformatear.

+0

He editado para poner la llamada 'string.replace()' en su propia línea; estaba oculta al final de la primera línea larga, lo que hace que la solución sugerida para esta respuesta no sea obvia en primero. –

+0

Sí, creo que la sustitución de todos los espacios antes de la división es la solución más elegante aquí. – expert

+0

El reemplazo de espacio más general sería: 'input.replaceAll (" \\ s + "," ")' –

1

Intente utilizar String.trim() en el resultado de la división

+0

** usando solamente regex y Split ** :) – expert

+0

¡Publiqué esto antes de la edición! : P – DGomez

+0

Está bien :) Pero agregué solo texto en negrita en edición :) – expert

3

De esta manera:

String.split("\\s*(;|,|\\s+)\\s*"); 

Pero da una cadena vacía en el principio (no hay manera de deshacerse de él utilizando sólo split).

Así, sólo algo como esto puede ayudar:

String.trim().split("\\s*(;|,)\\s*"); 
+0

No tuve suerte, da el mismo resultado que con '\\ s * [;,] + \\ s *' – expert

+0

Actualicé mi respuesta. funciona - verificado. –

+0

Por cierto, eliminé la división. Ver mi comentario –

0

En primer lugar, como DGomez señaló:

String.trim() 

uso que, en la cadena de entrada, por lo que el líder y los espacios finales se han ido .

Ahora, utilice esta expresión regular para dividir los mensajes de correo electrónico:

String.split("[,;]+\\s*") 

creo que esto debería hacerlo.

3

Solo tirando por ahí: si usas Guava, Splitter hace esto un poco más simple que con expresiones regulares.

Iterable<String> splitStrings = Splitter 
.onPattern("[;,]+") 
.trimResults() 
.split(string); 
Cuestiones relacionadas