1 / 17 Einstieg in die Informatik mit Java String Tokenizer Gerd Bohlender Institut für Angewandte und Numerische Mathematik
Gliederung 2 / 17 1 Überblick Tokenizer 2 StringTokenizer 3 Verwendung von String.split 4 Verwendung von StreamTokenizer
Gliederung 3 / 17 1 Überblick Tokenizer 2 StringTokenizer 3 Verwendung von String.split 4 Verwendung von StreamTokenizer
4 / 17 Überblick In diesem Kapitel wird beschrieben, wie ein String in zusammengehörige Einzelteile (Englisch: Token ) zerlegt werden kann. Beispiel: 2 Zeilen mit 6 Tokens (Zahlen) 111 222 333 +444-5.5e3 6 Statt Leerzeichen können auch beliebige andere Trennzeichen verwendet werden. Beispiel: 2 Tokens (Haupt- und Nebensatz) Zwei Tokens, welche durch Komma getrennt werden.
Gliederung 5 / 17 1 Überblick Tokenizer 2 StringTokenizer 3 Verwendung von String.split 4 Verwendung von StreamTokenizer
StringTokenizer Eine Zeichenkette kann in mehrere Tokens zerlegt werden. Tokens sind standardmäßig durch ein oder mehrere Whitespace-Zeichen getrennt: Leerzeichen, Tabulator (\t), neue Zeile (\n, \r), Formfeed (\f). Die Trennzeichen werden standardmäßig überlesen. Ein StringTokenizer wird per Konstruktor aus einem String erzeugt: String s = "Ein String aus 5 Tokens."; StringTokenizer st = new StringTokenizer (s); Solange noch Tokens verfügbar sind, können diese mit Hilfe der Methode nexttoken() beschafft werden. Mit der Methode hasmoretokens() kann geprüft werden, ob noch Tokens vorliegen. 6 / 17
Beispiel: StringTokenizer 7 / 17 Beispiel import java. u t i l. ;... S t r i n g s = Hallo Welt! ; S t r ingtokenizer s t = new StringTokenizer ( s ) ; while ( s t. hasmoretokens ( ) ) { System. out. p r i n t l n ( s t. nexttoken ( ) ) ; }... Ergebnis: Hallo Welt!
Sonderfälle StringTokenizer Andere Trennzeichen Sollen Tokens nicht mit den oben erwähnten Zeichen getrennt werden, so kann eine Liste der Trennzeichen als zweiter Parameter beim Konstruktor angegeben werden! String s = "Ein String. Zwei Sätze."; StringTokenizer st = new StringTokenizer (s, "."); Tokens: Ein String Zwei Sätze 8 / 17
Sonderfälle StringTokenizer 9 / 17 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 Länge 1. String s = "4(!) Tokens"; // beachte: 2 Leerzeichen! StringTokenizer st = new StringTokenizer(s," ",true); Tokens (beachte: 2 Leerzeichen!): 4(!) Tokens
10 / 17 Sonderfälle String Tokenizer Weitere Methoden: counttokens() liefert die Anzahl der noch folgenden Tokens, ohne sie per nexttoken() zu lesen; der Zustand des Tokenizers bleibt also unverändert. nexttoken(delim) ändert die Trennzeichen auf die Zeichen im String delim und führt danach nexttoken() aus. hasmoreelements() und nextelement() arbeiten ähnlich wie hasmoretokens() und nexttoken(), liefern aber keinen String sondern ein Ergebnis vom Typ Object.
Gliederung 11 / 17 1 Überblick Tokenizer 2 StringTokenizer 3 Verwendung von String.split 4 Verwendung von StreamTokenizer
12 / 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 regulären Ausdruck zur Beschreibung der Trennzeichen dar, der zahlreiche spezielle Codierungen für Zeichenfolgen enthalten kann. Eine Übersicht findet man in der Java-Dokumentation bei String.split.
13 / 17 String.split, reguläre Ausdrücke 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 _)
Verwendung von String.split Darstellung des regulären Ausdrucks Beachte: da der reguläre Ausdruck als String angegeben wird, muss z.b. ein Backslashzeichen \ durch ein weiteres Backslashzeichen als Sonderzeichen gekennzeichnet werden! Beispiel für regulären Ausdruck 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+ ) ; / / eine oder mehrere Z i f f e r n Ergibt die Tokens: "A", "B", "C D" Beispiel für regulären Ausdruck 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 15 / 17 1 Überblick Tokenizer 2 StringTokenizer 3 Verwendung von String.split 4 Verwendung von StreamTokenizer
16 / 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 zunächst von nexttoken() nur ein Code zurückgeliefert, der angibt ob eine Zahl, ein String, das Dateiende oder das Zeilenende gelesen wurden. Eine Zahl bzw. ein String können dann ggf. aus der Komponente nval bzw. sval des Tokenizers gelesen werden. Es gibt zahlreiche Möglichkeiten, die Generierung von Tokens zu beeinflussen (Berücksichtigung von Kommentaren, Stringkonstanten, usw.) nexttoken() kann eine IOException auslösen und muss daher z.b. in einem try...catch Block stehen.
Verwendung von StreamTokenizer, Beispiel 17 / 17 import java. i o. ; public class StreamTokenizerDemo { } public s t a t i c void main ( String [ ] args ) { Reader r = new StringReader ( aha 123 nanu 1.5 ) ; StreamTokenizer st = new StreamTokenizer ( r ) ; i n t token ; S t r i n g s ; Number n ; do { t r y { / / naechsten Token besorgen token = s t. nexttoken ( ) ; } catch ( IOException ioe ) { System. out. p r i n t l n ( Lesefehler ) ; token = 0; / / bei Fehler : Ersatzcode } i f ( token == StreamTokenizer.TT NUMBER) { n = s t. nval ; / / ggf. Zahl v e r a r b e i t e n System. out. p r i n t l n ( Zahl gelesen : + n ) ; } i f ( token == StreamTokenizer.TT WORD) { s = st. sval ; / / ggf. S t r i n g v e r a r b e i t e n System. out. 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. out. p r i n t l n ( A l l e Tokens wurden gelesen. ) ; }