% set s "Bypasses are devices which allow some ..." Bypasses are devices which allow some ... % string length $s 42
% string index $s 7 s
% string range $s 0 7 Bypasses % string range $s 38 end ...
% string compare "Aachen" "Saarbrücken" -1 % string compare "Aachen" "Aachen" 0
% string first PANIC "DON'T PANIC!" 6
% string last en "Irren ist menschlich" 11
% string toupper "Beispiel" BEISPIEL
% string tolower "BeisPiEl" beispiel
% string trim aaxxcxxbab abc xxcxx
Zum Vergleich von Zeichenketten stehen in Tcl gleich mehrere Möglichkeiten zur Verfügung:
Mit den Operatoren == != < > kann ein direkter Vergleich vorgenommen werden, wobei der gesamte Ausdruck in geschweifte Klammern gesetzt werden muß, da er sonst als eine Zeichenkette betrachtet wird.
% expr {"abc" < "xyz"}
1
% set x "New York"
New York
% if {$x == "New York"} {
puts "Hallo"
}
Hallo
%
Eine etwas anspruchsvollere Variante ist die Verwendung der glob-style-Regeln. Dieses Verfahren ist stark an die Technik der UNIX-Shell bei der Expansion von Dateinamen angelehnt. Implementiert ist die Technik durch den Befehl :
string match Pattern StringDieses Kommando liefert 1 zurück, wenn das Muster Pattern nach den glob-style-Regeln auf String paßt, ansonsten 0. Bei der Mustererkennung ist die Verwendung der Platzhalter von besonderer Bedeutung:
Bei komplexeren Aufgaben kann es sein, daß man mit diesem Verfahren zur Mustererkennung schnell an Grenzen stößt. Ein weitaus mächtigeres Werkzeug als das eben vorgestellte ist die Mustererkennung über reguläre Ausdrücke, welche in Tcl auf der Implementierung von Henry Spencer basiert.
Ein regulärer Ausdruck ist ein Ausdruck, der Zeichenketten spezifiziert. Er beschreibt über Vorschriften, welche Zeichenketten durch ihn abgedeckt sind.
Die Syntax des Befehls lautet wie folgt:
regexp ?Switches? Exp String ?MatchVar? ?SubMatchVar SubMatchVar ...?Rückgabewert ist 1, wenn String ganz oder teilweise durch den regulären Ausdruck Exp beschrieben wird. In der Variablen MatchVar wird der durch den gesamten Ausdruck beschriebene Teilstring gespeichert und in den Variablen SubMatchVar die Teilbereiche, die duch Teilausdrücke beschrieben werden. Wird der String durch den Ausdruck nicht beschrieben, ist der Rückgabewert 0.
Zur Bildung des regulären Ausdrucks Exp haben folgende Metazeichen eine besondere Bedeutung:
Table: Reguläre Ausdrücke mit regexp
Einige Beispiele:
{hallo} String, in dem irgendwo "hallo" steht
{^hallo} String, in dem am Anfang "hallo" steht
{hallo$} String, in dem am Ende "hallo" steht
{^hallo$} String besteht nur aus dem Wort "hallo"
{^[Hh]allo$} String, der entweder "hallo" oder "Hallo" enthält
{^.$} String der aus einem beliebigen Zeichen besteht
{[a-zA-Z][0-9]} Buchstabe gefolgt von einer Ziffer
{[a-zA-Z][0-9]*} Buchstabe gefolgt von keiner, einer oder
mehreren Ziffern
{([a-zA-Z][0-9])+} Buchstabe gefolgt von einer oder mehreren
Ziffern
{^((0x)?[0-9a-fA-F]+| [0-9]+)$} Strings, die eine Zahl in hexa-
dezimaler oder dezimaler Schreibweise enthalten
In Tcl sieht dies folgendermaßen aus:
% regexp {^[0-9]+$} 510
1
% regexp {^[0-9]+$} -510
0
Es muß beachtet werden, daß die regulären Ausdrücke in geschweifte Klammern eingeschloßen sind, da sonst der Parser versucht die Sonderzeichen zu interpretieren.
Wenn der regexp-Befehl mit mehr als zwei Argumenten aufgerufen wird, werden alle weiteren Argumente als Namen von Variablen interpretiert, die mit den Teilen aus dem String gefüllt werden, die jeweils von einem in Klammern eingeschlossenen Teilausdruck akzeptiert wurden. Dabei nimmt die erste Variable den Bereich des Strings auf, der durch den gesamten regulären Ausdruck akzeptiert wurde, und alle weiteren Variablen werden der Reihe nach mit den von den einzelnen Teilausdrücken akzeptierten Teilbereichen des Strings besetzt.
% regexp {([0-9]+) *([a-z]+)} "Rundweg 10 km" a b c
1
% set a
10 km
% set b
10
% set c
km
Zusätzlich kann man den regexp-Befehl mit den Switches -nocase und -indices steuern. Der Switch -nocase bestimmt, daß der Unterschied zwischen Groß- und Kleinschreibung ignoriert wird.
% regexp {[a-z]} A
0
% regexp -nocase {[a-z]} A
1
Über -indices wird festgelegt, daß in den Variablen (wenn regexp mit mehr als zwei Argumenten aufgerufen wurde) nicht die Teilbereiche als Strings stehen, sondern in Form von Indizes, wobei ein Index aus zwei Integerzahlen besteht, welche den Anfang und das Ende des Teilbereichs innerhalb des ganzen Strings repräsentieren.
% regexp -indices {([0-9]+) *([a-z]+)} "Rundweg 10 km" a b c
1
% set a
8 12
% set b
8 9
% set c
11 12