2011-11-16 12 views
8

Questo è un follow-up a this question.Comportamento di divisione stringa su stringa vuota e su stringa delimitatore singolo

La domanda è nella seconda riga in basso.

"".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

Vedi [SI-5096] (https://issues.scala-lang.org/browse/SI-5069) "Bug in split() quando delimitatori si verificano alla fine della stringa" – 4e6

+1

Questo è il motivo per Google Guava ha creato com.google.common.base.Splitter – Schildmeijer

risposta

5

Come per la java.util.regex.Patternsource, che String.split(..) usi,

"".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

quindi si comporta correttamente perché il metodo che chiama ... si comporta in questo modo? Mi chiedo cosa dirà il mio capo quando chiudo il prossimo bug report con un argomento del genere. –

+0

@Kim Stebel, né 'SO' è un bugtracker, né dovrei risolvere bug per questo. Questo post ha sostanzialmente chiesto chiarimenti, e non una soluzione, e ho semplicemente cercato di presentare perché il metodo 'split' si sta comportando in questo modo. calmati. – srkavin

7

No, perché secondo the relevant javadoc "trailing stringhe vuote verrà scartato".

+0

Quindi perché non viene scartato nella prima riga? (Suddivisione su stringa vuota) – snappy

+0

Questo dovrebbe essere inteso come "le stringhe vuote alla fine dell'array risultante verranno scartate". – madth3

+0

Immagino che veda la stringa vuota come primo token, quindi divida dopo di esso, quindi tecnicamente è una stringa vuota iniziale –

0

Per includere le finali stringhe vuote, utilizzare l'altra attuazione 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", ""} 
Problemi correlati