2016-10-17 1 views
1

Ich schrieb dieses einfache Programm, das eine gegebene Eingabe bei jedem Nicht-Digit-Zeichen aufteilt. DieseString Splitting falscher Ausgang

public class Fileread { 
    public static void main(String[] args) throws IOException { 
    //Declarations 
    String[] temp; 
    String current; 

    //Execution 
    BufferedReader br = new BufferedReader(new FileReader("input.txt")); 
    while ((current = br.readLine()) != null) { 
     temp = current.split("\\D"); //Splitting at Non Digits 
     for (int i = 0; i < temp.length; i++) { 
     System.out.println(temp[i]); 
     } 
    } 
    } 
} 

ist die input.txt:

hello1world2 
world3 
end4of5world6 

Ausgang:

1 




2 





3 



4 

5 




6 

Warum haben so viele zusätzliche Leerzeichen erscheinen? Ich muss jede Nummer in einer separaten Zeile ohne Zwischenräume drucken. Wie kann ich das beheben?

+7

Verwenden '\\ D +' Muster. Ein führendes leeres Element kann jedoch weiterhin beibehalten werden, wenn Ihre Strings mit Nicht-Ziffern beginnen. –

Antwort

1
//Declarations 
     String[] temp; 
     String current; 

     //Execution 
     BufferedReader br = new BufferedReader(new FileReader("d://input.txt")); 
     while ((current = br.readLine()) != null) { 
      temp = current.split("\\D+"); //Splitting at Non Digits 
      for (int i = 0; i < temp.length; i++) { 
       if (!temp[i].equalsIgnoreCase("")) { 
        System.out.println(temp[i]); 
       } 
      } 
     } 
+0

Es hat funktioniert! Es funktioniert nicht, wenn ich! Temp [i] .equals ("") setze. Aber es funktioniert, wenn ich! Temp [i] .equalsIgnoreCase (""). Was ist der Unterschied? Können Sie erklären? –

+0

Meine schlechte ... Es funktioniert für **! Temp [i] .equals ("") ** auch ... Habe es nicht versucht ... Wie auch immer, Danke :) –

4

Es teilt sich auf JEDE und JEDE Nicht-Ziffer.

Um Strings von Nicht-Ziffern als ein Trennzeichen zu behandeln, statt

temp = current.split("\\D+"); 

angeben. Das Hinzufügen des Pluszeichens lässt das Muster mit einem oder mehreren aufeinanderfolgenden Nicht-Ziffernzeichen übereinstimmen.

0

Javas String#split Methode wird ein Token für jeden Punkt zwischen zwei Trennzeichen erstellt. Betrachten Sie das folgende Beispiel:

String s = "a,b,c,,,f"; 

Da der Begrenzer , erscheint nacheinander mit nichts dazwischen, erzeugt s.split(",") die folgende Ausgabe:

{"a", "b", "c", "", "", "f"} 

Sie werden feststellen, es gibt zwei leere Zeichenfolgen in diesem Array; ein Leerzeichen wird eingefügt, um das Token darzustellen, das zwischen jedem Paar aufeinanderfolgender Kommas aufgetreten wäre. Grundsätzlich wird die Zeichenfolge als a,b,c,(blank),(blank),f behandelt.

Die Lösung dafür besteht darin, aufeinander folgende Trennzeichen als einzelnes Trennzeichen zu behandeln. Nun ist es wichtig, sich daran zu erinnern, dass Ihr Argument zu split eigentlich ein Literal für reguläre Ausdrücke ist. So können Sie den + gierig regex quantifier umfassen dem Motor zu sagen, ein oder mehr aufeinanderfolgende Trennzeichen zu entsprechen, und behandeln sie als Single-Split-Punkt:

s.split(",+") 

Für das obige Beispiel ergibt dies nun folgenden (sans leere Strings):

{"a", "b", "c", "f"} 

Sie können eine ähnliche Technik, um Ihre regex anwenden, mit \\D+. Kurz

1

In verwenden

.replaceFirst("^\\D+","").split("\\D+") 

Splitting der String mit \D (eine nicht-stellige char Anpassungsmuster) bedeutet, dass Sie zu einem Zeitpunkt, eine einzigen nicht-stelligen char übereinstimmen und die Zeichenfolge an, dass brechen verkohlen. Wenn Sie auf einen Batzen Zeichen aufteilen müssen, müssen Sie mehrere aufeinander folgende Zeichen übereinstimmen, und in Ihrem Fall müssen Sie nur fügen Sie ein + quantifier nach \\D.

Das bedeutet jedoch, dass Sie bei Index 0 immer noch ein leeres Element haben, wenn Ihre Zeichenfolge am Anfang der Zeichenfolge keine Ziffern hat. Die Problemumgehung ist Entfernen Sie den Teilstring am Anfang mit dem Split-Muster.

Die endgültige Lösung ist

List<String> strs = Arrays.asList("hello1world2", "world3", "end4of5world6"); 
for (String str : strs) { 
    System.out.println("---- Next string ----"); 
    String[] temp = str.replaceFirst("^\\D+","").split("\\D+"); 
    for (String s: temp) { 
     System.out.println(s); 
    } 
} 

Siehe online Java demo