2010-09-21 10 views
8

Próbuję użyćString podziału nie zwrotach pustych wyników

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

problemem jest to, że chcę go zawierać puste wyników.

Zwraca: [value1, value2, value3]
Powinno być: [value1, value2, , value3]

Czy ktoś zna regexp to naprawić?

Ok Znalazłem przyczynę problemu. Ja faktycznie czyta plik tekstowy i zawiera tę linię:

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

Kiedy proces ten wiersz czyta plik tekstowy produkuje błędną wynik mowa powyżej, czyli nie zawiera żadnych pustych rezultaty w przypadkach lubię to: :::::.

Ale kiedy używam powyższej linii w programie testowym, nie kompiluje się i otrzymuję "nieprawidłową sekwencję ucieczki". Myślę, że to z powodu "\ &".

Czy istnieje obejście tego problemu za pomocą wyrażenia regularnego?

Odpowiedz

18

split obejmuje pustych mecze w rezultacie mają spojrzeć na docs here. Jednak domyślnie ciągi pustych ciągów znaków (na końcu tablicy) są odrzucane. Jeśli chcesz je również uwzględnić, spróbuj split(":", -1).

+0

Dzięki ... dodanie -1 rzeczywiście rozwiązało problem z znakami specjalnymi podczas odczytu z pliku tekstowego. Zawiera również puste ciągi. – Marquinio

+1

link do dokumentu nie działa. –

1

Szczerze mówiąc, nie widzę dużego rozdarcia podzielonego. StringTokenizer działa równie dobrze dla większości takich rzeczy i łatwo odeśle tokeny (dzięki czemu można stwierdzić, że nie było nic pomiędzy:).

Po prostu żałuję, że nie działa to lepiej z ulepszoną pętlą for, ale poza tym nie zaszkodzi by spróbować.

Myślę, że istnieje regexp trick, aby otrzymać dopasowane żetony, ale wróciłem 20 lat bez nauki regexp i to wciąż nie była najlepsza odpowiedź na żaden problem, z którym walczyłem (nie, żebym to zrobił Właściwie to wiem, ponieważ nigdy go nie używam, ale rozwiązania bez regexp są na ogół zbyt łatwe do pokonania.)

2

Myślę, że StringTokenizer może działać lepiej dla ciebie, YMMV.

+0

Nie używaj StringTokenizer proszę. Oracle zaleca metodę "split". Jest to część strony dokumentacji StringTokenizer: 'StringTokenizer jest starszą klasą, która jest zachowana ze względu na kompatybilność, chociaż jej użycie jest odradzane w nowym kodzie. Zaleca się, aby każdy, kto szukał tej funkcji, używał zamiast tego metody split String lub pakietu java.util.regex. " –

4

Działa u mnie.

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+"\""); 
    } 
} 

daje wyświetlamy

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

Użyj negatywny granicę w podzielonym stwierdzeniem:

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

Wyniki:

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); 
} 

drukuje

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

który jest dokładnie to, co chcesz. Twój błąd jest gdzieś indziej ...

0

To powinno zadziałać, ale jeśli wystąpią problemy, należy wykonać StringTokenizer.

1

Korzystanie Guava „s Splitter Klasa:

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

Splitter nie pominąć pustych wyników domyślnie, ale można zrobić jeden, który nie. Choć wydaje się, że inni mówią, że to, co robicie, powinno również działać.

0

To działa,

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(); 
    } 
} 
} 

Tutaj jest plik testowy,

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