Einstieg in die Informatik mit Java String Tokenizer

Gerd Bohlender Institut fur ¨ Angewandte und Numerische Mathematik

1 / 17

Gliederung

¨ 1 Uberblick Tokenizer

2 StringTokenizer

3 Verwendung von String.split

4 Verwendung von StreamTokenizer

2 / 17

Gliederung

¨ 1 Uberblick Tokenizer

2 StringTokenizer

3 Verwendung von String.split

4 Verwendung von StreamTokenizer

3 / 17

¨ Uberblick In diesem Kapitel wird beschrieben, wie ein String in ¨ zusammengehorige Einzelteile (Englisch: Token“) zerlegt ” werden kann.

Beispiel: 2 Zeilen mit 6 Tokens (Zahlen) 111 222 333 +444 -5.5e3 6 ¨ Statt Leerzeichen konnen auch beliebige andere Trennzeichen verwendet werden.

Beispiel: 2 Tokens (Haupt- und Nebensatz) Zwei Tokens, welche durch Komma getrennt werden.

4 / 17

Gliederung

¨ 1 Uberblick Tokenizer

2 StringTokenizer

3 Verwendung von String.split

4 Verwendung von StreamTokenizer

5 / 17

StringTokenizer Eine Zeichenkette kann in mehrere Tokens zerlegt werden. ¨ Tokens sind standardmaßig durch ein oder mehrere Whitespace-Zeichen getrennt: Leerzeichen, Tabulator (\t), neue Zeile (\n, \r), Formfeed (\f). Die Trennzeichen werden ¨ standardmaßig uberlesen. ¨ Ein StringTokenizer wird per Konstruktor aus einem String erzeugt: String s = "Ein String aus 5 Tokens."; StringTokenizer st = new StringTokenizer (s); ¨ Solange noch Tokens verfugbar sind, konnen diese mit Hilfe ¨ der Methode nextToken() beschafft werden. Mit der Methode hasMoreTokens() kann gepruft ¨ werden, ob noch Tokens vorliegen.

6 / 17

Beispiel: StringTokenizer Beispiel import j a v a . u t i l . ∗ ; ... S t r i n g s = ” H a l l o Welt ! ” ; S t r i n g T o k e n i z e r s t = new S t r i n g T o k e n i z e r ( s ) ; while ( s t . hasMoreTokens ( ) ) { System . o u t . p r i n t l n ( s t . nextToken ( ) ) ; }...

Ergebnis: Hallo Welt !

7 / 17

¨ StringTokenizer Sonderfalle

Andere Trennzeichen ¨ Sollen Tokens nicht mit den oben erwahnten Zeichen getrennt werden, so kann eine Liste der Trennzeichen als zweiter Parameter beim Konstruktor angegeben werden! String s = "Ein String. Zwei S¨ atze."; StringTokenizer st = new StringTokenizer (s, "."); Tokens: Ein String ¨ Zwei Satze

8 / 17

¨ StringTokenizer Sonderfalle Behandlung der Trennzeichen Sollen die Trennzeichen ebenfalls als Tokens betrachtet werden, dann kann true als dritter Parameter beim Konstruktor angegeben werden! Jedes Trennzeichen ist dann ein Token der ¨ Lange 1. String s = "4(!) Tokens"; // beachte: 2 Leerzeichen! StringTokenizer st = new StringTokenizer(s," ",true); Tokens (beachte: 2 Leerzeichen!): 4(!)

Tokens 9 / 17

¨ String Tokenizer Sonderfalle

Weitere Methoden: • countTokens() liefert die Anzahl der noch folgenden

Tokens, ohne sie per nextToken() zu lesen; der Zustand ¨ des Tokenizers bleibt also unverandert. • nextToken(delim) andert ¨ die Trennzeichen auf die Zeichen im String delim und fuhrt danach nextToken() ¨ aus. • hasMoreElements() und nextElement() arbeiten ahnlich ¨ wie hasMoreTokens() und nextToken(), liefern aber keinen String sondern ein Ergebnis vom Typ Object.

10 / 17

Gliederung

¨ 1 Uberblick Tokenizer

2 StringTokenizer

3 Verwendung von String.split

4 Verwendung von StreamTokenizer

11 / 17

String.split

Eine alternative Variante ist die Verwendung der Methode split(regex) aus der Klasse String. Das Ergebnis ist ein Feld von Strings. ¨ Hierbei stellt der String regex einen regularen Ausdruck“ zur ” Beschreibung der Trennzeichen dar, der zahlreiche spezielle Codierungen fur ¨ Zeichenfolgen enthalten kann. ¨ Eine Ubersicht findet man in der Java-Dokumentation bei String.split.

12 / 17

¨ Ausdrucke String.split, regulare ¨ Einige Beispiele: • [abc] eines der Zeichen a, b, c • [a-z]* beliebig viele Kleinbuchstaben (∗ bedeutet

beliebige Wiederholung des vorigen Elements, inklusive 0-mal) • [a-zA-Z]+ beliebig viele Groß- oder Kleinbuchstaben (+

bedeutet beliebige Wiederholung des vorigen Elements, mindestens einmal) • . jedes beliebige Zeichen • \. ein Punkt • \d eine Ziffer 0 bis 9 • \s ein Whitespacezeichen (Leerzeichen, Tabulator, neue

Zeile, Formfeed) • \w ein Wortzeichen (Buchstabe, Ziffer, Unterstrich _) 13 / 17

Verwendung von String.split ¨ Darstellung des regularen Ausdrucks ¨ Ausdruck als String angegeben wird, Beachte: da der regulare muss z.B. ein Backslashzeichen \ durch ein weiteres Backslashzeichen als Sonderzeichen gekennzeichnet werden!

¨ Beispiel fur Ausdruck ¨ regularen S t r i n g s t r = ” A77B345C D” ; S t r i n g [ ] token = s t r . s p l i t ( ” \\d+ ” ) ; / / e i n e oder mehrere Z i f f e r n Ergibt die Tokens: "A", "B", "C D"

¨ Beispiel fur Ausdruck ¨ regularen S t r i n g [ ] token = ” a , b , c . ” . s p l i t ( ” [ , \ \ . ] + ” ) ; / / e i n oder mehrere Kommata , Punkte , Leerzeichen Ergibt die Tokens: "a", "b", "c"

14 / 17

Gliederung

¨ 1 Uberblick Tokenizer

2 StringTokenizer

3 Verwendung von String.split

4 Verwendung von StreamTokenizer

15 / 17

Verwendung von StreamTokenizer Ein StreamTokenizer liest Tokens von einem Eingabestrom. Dies ist meistens ein File vom Typ BufferedReader, es kann aber auch ein String sein mittels StringReader. • Hierbei wird zunachst ¨ von nextToken() nur ein Code

zuruckgeliefert, der angibt ob eine Zahl, ein String, das ¨ Dateiende oder das Zeilenende gelesen wurden. • Eine Zahl bzw. ein String konnen ¨ dann ggf. aus der Komponente nval bzw. sval des Tokenizers gelesen werden. • Es gibt zahlreiche Moglichkeiten, ¨ die Generierung von Tokens zu beeinflussen (Berucksichtigung von ¨ Kommentaren, Stringkonstanten, usw.) • nextToken() kann eine IOException auslosen ¨ und muss daher z.B. in einem try...catch Block stehen. 16 / 17

Verwendung von StreamTokenizer, Beispiel import j a v a . i o . ∗ ; public class StreamTokenizerDemo { public s t a t i c void main ( S t r i n g [ ] args ) { Reader r = new S t r i n g R e a d e r ( ” aha 123 nanu 1 . 5 ” ) ; StreamTokenizer s t = new StreamTokenizer ( r ) ; i n t token ; String s ; Number n ; do { t r y { / / naechsten Token besorgen token = s t . nextToken ( ) ; } catch ( IOException i o e ) { System . o u t . p r i n t l n ( ” L e s e f e h l e r ” ) ; token = 0 ; / / b e i F e h l e r : Ersatzcode } i f ( token == StreamTokenizer . TT NUMBER) { n = s t . n v a l ; / / g g f . Zahl v e r a r b e i t e n System . o u t . p r i n t l n ( ” Zahl gelesen : ” + n ) ; } i f ( token == StreamTokenizer .TT WORD) { s = s t . sval ; / / ggf . S t r i n g v e r a r b e i t e n System . o u t . p r i n t l n ( ” S t r i n g gelesen : ” + s ) ; } } while ( token ! = StreamTokenizer . TT EOF ) ; / / a l l e Tokens gelesen ? System . o u t . p r i n t l n ( ” A l l e Tokens wurden gelesen . ” ) ; } } 17 / 17