5 Stimmen

Tokenisierungsproblem in Java mit Trennzeichen ". "

Ich muss einen Text mit Hilfe des Trennzeichens aufteilen ". " . Ich möchte zum Beispiel diese Zeichenkette:

Washington is the U.S Capital. Barack is living there.

In zwei Teile zu schneiden:

Washington is the U.S Capital. 
Barack is living there.

Hier ist mein Code:

// Initialize the tokenizer
StringTokenizer tokenizer = new StringTokenizer("Washington is the U.S Capital. Barack is living there.", ". ");
 while (tokenizer.hasMoreTokens()) {
      System.out.println(tokenizer.nextToken());

}

Und das Ergebnis ist leider :

Washington
is
the
U
S
Capital
Barack
is
living
there

Kann mir jemand erklären, was hier los ist?

31voto

polygenelubricants Punkte 362173

Verwenden Sie nicht StringTokenizer ; es ist eine Legacy-Klasse. Verwenden Sie java.util.Scanner oder einfach String.split stattdessen.

    String text = "Washington is the U.S Capital. Barack is living there.";
    String[] tokens = text.split("\\. ");
    for (String token : tokens) {
        System.out.println("[" + token + "]");
    }

Dies wird gedruckt:

[Washington is the U.S Capital]
[Barack is living there.]

Beachten Sie, dass split y Scanner sind "regex"-basiert (reguläre Ausdrücke), und da . ist ein spezielles Regex-"Meta-Zeichen", es muss mit \ . Da wiederum \ selbst ein Escape-Zeichen für Java-Stringliterale ist, müssen Sie schreiben "\\. " als Begrenzungszeichen.

Das klingt vielleicht kompliziert, ist es aber nicht. split y Scanner sind viel besser als StringTokenizer und Regex ist gar nicht so schwer zu erlernen.

Tutorials zu regulären Ausdrücken

Verwandte Fragen

API-Links

  • java.util.StringTokenizer
    • StringTokenizer ist eine Legacy-Klasse, die aus Kompatibilitätsgründen beibehalten wird, obwohl von ihrer Verwendung in neuem Code abgeraten wird. Es wird empfohlen, dass jeder, der diese Funktionalität benötigt, die Klasse split Methode der String oder die java.util.regex stattdessen das Paket.
  • java.util.Scanner
  • String[] String.split
    • Teilt diese Zeichenkette um Übereinstimmungen mit dem angegebenen regulären Ausdruck.

Aber was lief schief?

Das Problem ist, dass StringTokenizer nimmt jedes Zeichen in der Begrenzungszeichenfolge als einzelne Begrenzungszeichen, d. h. NICHT die gesamte String selbst.

Von der API:

StringTokenizer(String str, String delim) : Konstruiert einen String-Tokenizer für die angegebene Zeichenkette. Die Zeichen in der delim sind die Begrenzungszeichen zum Trennen von Token. Die Begrenzungszeichen selbst werden nicht als Token behandelt.

1voto

krock Punkte 27758

Ihr StringTokenizer-Konstruktor nimmt das Begrenzungszeichen ". ", das mit Punkt oder Leerzeichen als Begrenzungszeichen übereinstimmt.

0voto

bdhar Punkte 19781

Versuchen Sie, das Leerzeichen nach dem Punkt im Begrenzungszeichen zu entfernen. Verwenden Sie stattdessen dies.

StringTokenizer tokenizer = new StringTokenizer("Washington is the U.S Capital. Barack is living there.", ".");

5 Stimmen

Dadurch wird auch "U.S." geteilt.

0 Stimmen

@josek.. oops.. sorry, ich habe es nicht bemerkt :)

0voto

Jitendra Punkte 1148
  • StringTokenizer(String str) : erzeugt StringTokenizer mit der angegebenen Zeichenkette.
  • StringTokenizer(String str, String delim) : erzeugt einen StringTokenizer mit der angegebenen Zeichenkette und dem Begrenzungszeichen.
  • StringTokenizer(String str, String delim, boolean returnValue) : erzeugt StringTokenizer mit angegebenem String, Delimiter und returnValue.

    Wenn der Rückgabewert true ist, werden Begrenzungszeichen als Token betrachtet. Ist der Rückgabewert false, dienen Trennzeichen zur Trennung von Token.

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