Einstieg in die Informatik mit Java
Transcription
Einstieg in die Informatik mit Java
Einstieg in die Informatik mit Java String Tokenizer Gerd Bohlender Institut für Angewandte und Numerische Mathematik 1 / 17 Gliederung 1 Überblick Tokenizer 2 StringTokenizer 3 Verwendung von String.split 4 Verwendung von StreamTokenizer 2 / 17 Gliederung 1 Überblick Tokenizer 2 StringTokenizer 3 Verwendung von String.split 4 Verwendung von StreamTokenizer 3 / 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. 4 / 17 Gliederung 1 Überblick 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 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 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 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 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 9 / 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. 10 / 17 Gliederung 1 Überblick 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 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. 12 / 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 _) 13 / 17 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+ ” ) ; / / e i n e 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 1 Überblick 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 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. 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