2011-11-16 18 views
8

Esto es una continuación de this question.Comportamiento de división de cadenas en cadena vacía y en cadena de delimitador único

La pregunta está en la segunda línea a continuación.

"".split("x"); //returns {""} // ok 
"x".split("x"); //returns {} but shouldn't it return {""} because it's the string before "x" ? 
"xa".split("x"); //returns {"", "a"} // see?, here "" is the first string returned 
"ax".split("x"); //returns {"a"} 
+1

véase [SI-5096] (https://issues.scala-lang.org/browse/SI-5069) "Bug en Split() cuando delimitadores se producen al final de la cadena" – 4e6

+1

Esta es la razón por Google Guava creó com.google.common.base.Splitter – Schildmeijer

Respuesta

5

Según el java.util.regex.Patternsource, que String.split(..) usos,

"".split("x"); // returns {""} - valid - when no match is found, return the original string 
"x".split("x"); // returns {} - valid - trailing empty strings are removed from the resultant array {"", ""} 
"xa".split("x"); // returns {"", "a"} - valid - only trailing empty strings are removed 
"ax".split("x"); // returns {"a"} - valid - trailing empty strings are removed from the resultant array {"a", ""} 
+2

por lo que se comporta correctamente porque el método que llama ... se comporta de esa manera? Me pregunto qué diría mi jefe cuando cierre el próximo informe de fallos con un argumento como ese. –

+0

@Kim Stebel, ni 'SO' es un rastreador de errores, ni se supone que debo corregir errores. Esta publicación básicamente me pidió una aclaración, y no una solución, y simplemente traté de explicar por qué el método 'split' se está comportando de esa manera. tómalo con calma. – srkavin

7

No, porque de acuerdo a the relevant javadoc "arrastrando cadenas vacías será descartado".

+0

Entonces, ¿por qué no se descarta en la primera línea? (División en cadena vacía) – snappy

+0

Esto debe entenderse como "cadenas vacías al final de la matriz resultante serán descartadas". – madth3

+0

Supongo que ve la cadena vacía como la primera señal, luego se divide después, por lo que técnicamente es una cadena vacía principal –

0

Para incluir las cadenas vacías de fuga, usar la otra aplicación de split.

"".split("x", -1); // returns {""} - valid - when no match is found, return the original string 
"x".split("x", -1); // returns {"", ""} - valid - trailing empty strings are included in the resultant array {"", ""} 
"xa".split("x", -1); // returns {"", "a"} - valid 
"ax".split("x", -1); // returns {"a", ""} - valid - trailing empty strings are included in the resultant array {"a", ""} 
Cuestiones relacionadas