8 Stimmen

String-Split liefert keine leeren Ergebnisse

Ich versuche, die

"value1:value2::value3".split(":");

Das Problem ist, dass ich die leeren Ergebnisse einbeziehen möchte.

Sie kehrt zurück: [value1, value2, value3]
So sollte es sein: [value1, value2, , value3]

Kennt jemand die Regexp, um dies zu beheben?

Ok, ich habe die Ursache des Problems gefunden. Ich lese gerade eine Textdatei und die enthält diese Zeile:

123:;~\&:ST02:M:test:M:4540145::type;12:51253:D:2.2:567766::AL:::::::2.2b

Wenn ich diese Zeile verarbeite, indem ich die Textdatei lese, kommt es zu dem oben erwähnten fehlerhaften Ergebnis, d. h. es werden keine leeren Ergebnisse in Fällen wie diesem angezeigt: :::::.

Aber wenn ich die obige Zeile in einem Testprogramm verwende, lässt sie sich nicht kompilieren und ich erhalte eine "ungültige Escape-Sequenz". Ich denke, das liegt an dem "\&".

Gibt es eine Lösung für dieses Problem, indem ein regulärer Ausdruck verwendet wird?

1voto

f1sh Punkte 10477
public static void main(String[] args){
  String[] arr = "value1:value2::value3".split(":");
  for(String elm:arr){
    System.out.println("'"+elm+"',");
  }
  System.out.println(arr.length);
}

druckt

'value1',
'value2',
'',
'value3',
4

Das ist genau das, was Sie wollen. Ihr Fehler liegt woanders...

1voto

ColinD Punkte 106101

Verwendung von Guave 's Splitter Klasse:

Iterable<String> split = Splitter.on(':').split("value1:value2::value3");

Splitter lässt standardmäßig keine leeren Ergebnisse aus, obwohl man eine solche Funktion erstellen kann. Obwohl es scheint von dem, was andere sagen, dass das, was Sie tun, sollte auch funktionieren.

0voto

AHungerArtist Punkte 9134

Das sollte funktionieren, aber geben Sie StringTokenizer ausprobieren, wenn Sie immer noch Probleme haben.

0voto

ChuckCottrill Punkte 4109

Das funktioniert,

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;

public class split {
public static void main(String[] args)
{
    String data = null;
    try {
    BufferedReader br = new BufferedReader(new FileReader(new File("split.csv")));
    while( (data=br.readLine())!=null)
    {
        System.out.println("line:"+data);
        String[] cols = data.split(":",-1);
        System.out.println("count:"+cols.length);
        for(int x=0;x<cols.length;++x)
        {
            System.out.println("["+x+"] =("+cols[x]+")");
        }
    }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Hier ist eine Testdatei,

a:b:c:d:e
a:b:c:d:
a:b:c::
a:b::: 
a::::
::::
::::e
:::d:e
::c:d:e
:b:c:d:e
a:b:c:d:e

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X