2010-09-21 6 views
8

Rückkehr Ich versucheString Split nicht leer Ergebnisse

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

Problem zu verwenden, ist, dass ich es die leeren Ergebnisse enthalten sein soll.

Es gibt: [value1, value2, value3]
Es sollte: [value1, value2, , value3]

Kennt jemand die regexp dieses Problem beheben?

Ok Ich habe Ursache des Problems gefunden. Ich lese eigentlich eine Textdatei und enthält die folgende Zeile:

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

Wenn ich verarbeiten diese Zeile liest die Textdatei es das fehlerhafte Ergebnis oben erwähnt erzeugt, die es keine leere Ergebnisse in Fällen enthalten ist ist so was: :::::.

Aber wenn ich die obige Zeile in einem Testprogramm verwende, kompiliert es nicht und ich bekomme eine "ungültige Escape-Sequenz". Ich denke es ist wegen der "\ &".

Gibt es eine Problemumgehung für dieses Problem, indem Sie einen regulären Ausdruck verwenden?

Antwort

18

split leer Matches im Ergebnis nicht enthalten, haben einen Blick auf die docs here. Standardmäßig werden nachgestellte leere Zeichenfolgen (die am Ende des Arrays) verworfen. Wenn Sie diese ebenfalls hinzufügen möchten, versuchen Sie split(":", -1).

+0

Danke ... das Hinzufügen eines -1 löste das Sonderzeichenproblem beim Lesen aus einer Textdatei. Es enthielt auch leere Zeichenfolgen. – Marquinio

+1

Docs-Verknüpfung funktioniert nicht. –

1

Ich sehe nicht wirklich das große Los von Split. StringTokenizer funktioniert genauso gut für die meisten Dinge wie diese und wird leicht die Token zurücksenden (damit Sie sagen können, dass es nichts dazwischen gab).

Ich wünschte nur, es funktioniert ein wenig besser mit der erweiterten for-Schleife, aber das abgesehen davon würde es nicht schaden, es zu versuchen.

Ich denke, es gibt einen Regexp-Trick, um Ihre gepaarten Token zurück zu bekommen, aber ich bin 20 Jahre gegangen, ohne Regexp zu lernen und es war immer noch nie die beste Antwort auf jedes Problem, das ich angegangen habe (Nicht das ich würde eigentlich weiß, da ich es nie benutze, aber die non-regexp Lösungen sind in der Regel zu einfach zu schlagen.)

2

Ich denke, dass ein StringTokenizer könnte besser für Sie arbeiten, YMMV.

+0

Sie StringTokenizer bitte nicht verwenden. Oracle empfiehlt die Split-Methode. Dies ist Teil der StringTokenizer-Dokumentationsseite: 'StringTokenizer ist eine Legacy-Klasse, die aus Kompatibilitätsgründen beibehalten wird, obwohl die Verwendung in neuem Code nicht empfohlen wird. Es wird empfohlen, dass jeder, der diese Funktionalität sucht, stattdessen die Split-Methode von String oder das java.util.regex-Paket verwendet. –

4

Funktioniert für mich.

class t { 
    public static void main(String[] _) { 
     String t1 = "value1:value2::value3"; 
     String[] t2 = t1.split(":"); 
     System.out.println("t2 has "+t2.length+" elements"); 
     for (String tt : t2) System.out.println("\""+tt+"\""); 
    } 
} 

gibt dem Ausgang

$ java t 
t2 has 4 elements 
"value1" 
"value2" 
"" 
"value3" 
1

eine negative Grenze in Ihre Split-Anweisung verwenden:

String str = "val1:val2::val3"; 
String[] st = str.split(":", -1); 
for (int i = 0; i< st.length; i++) 
    System.out.println(st[i]); 

Ergebnisse:

val1 
val2 

val3 
1
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. Dein Fehler ist woanders ...

0

Das sollte funktionieren, aber gebe StringTokenizer einen gehen, wenn Sie immer noch Probleme haben.

1

Mit Guava ‚s Splitter Klasse:

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

Splitter nicht leer Ergebnisse standardmäßig weglassen, wenn Sie kann man machen, das tut. Obwohl es scheint, was andere sagen, sollte das, was du machst, genauso gut funktionieren.

0

Dies 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