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

Documents pareils