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