Funktionen auf Zeichenketten
Einführung
Zeichenketten (Text, String) können als Teil eines Geräteprotokolls auftreten, z.B. als Fehlermeldung eines Subsystems oder der Messdatenübertragung über eine serielle Schnittstelle. Auch viele WEB-Basierte Kommuniationsprotokolle bauen auf Strings auf.
Das Mathemodul unterstützt den skalaren Typ string, in dem typischerweise mit UTF-8 kodierte Zeichen enthalten sind.
Alle Datentypen können z.B. mit str() in den string-Typ gewandelt werden oder mit den anderen cast-Operatoren in die entsprechenden Zieltypen, sofern dabei keine syntaktischen Fehler auftreten.
Operatoren auf Text
Mit dem Datentyp String werden folgende Operatoren unterstützt:
-
alle Vergleichsoperatoren, dabei gilt die numerische Reihenfolge der ASCII-Zeichen: z.B.
'4' < 'A' < 'a' -
+- Operator, verknüpft zwei Stringss_connected = s1 + s2;tippstr(x)wandelt jeden Datentyp in eine String-Darstellung, auch Mehrdimensionale Objekte wie Vektoren und Matrizen. Um mehr Kontrolle über die Formatierung zu bekommen, kann die FunktionsFormat(f, ...)hilfreich sein.
Eigenschaften und Basisfunktionen
Länge einer Zeichenkette "sLength"
Die Länge einer Zeichenkette s in Bytes wird wie folgt berechnet
l = sLength(s);
In der UTF-8 Kodierung können mit entsprechender Kodierung Sonderzeichen auch mehrere Bytes belegen. Diese Funktion bestimmt die Anzahl der Bytes, nicht die Anzahl der (druckbaren) Zeichen!
Extraktion einer Teilzeichenkette als Kopie "sCopy"
Ein Teilstring r des Strings s kann wie folgt extrahiert werden
r = sCopy(s, b); // Kopie der Zeichenkette s ab Position b
r = sCopy(s, b, c); // Kopie der Zeichenkette s ab Position b der Länge c
r = sCopy(s, BC); // BC ist ein Vektor der Länge 2, der b und c beinhaltet (Verhalten wie bei sCopy(s, b, c)
r = sCopy(s, BC, sel); // BC ist eine Matrix mit zwei Spalten, die zu b und c korrespondieren,
// wobei sel einen selektierenden Zeilenindex darstellt
Die Matrix BC ist an vielen Stellen das Ergebnis von Suchfunktionen, z.B. sFind(), die mehrere Treffer in dem String liefern können. Über den Index sel kann der entsprechende Textteil unmittelbar extrahiert werden.
Beispiel:
// 0 1 2 3
// 0123456789012345678901234567890123456789
geo = 'lat: 51.234567, lon: 12.3456789';
p6 = sFind(geo, 'lat:\s*([0-9.+-]+)', {subex: true});
// => p6 := [ [ 0,14] // refers to 'lat: 51.234567'
// , [ 5, 9]]; // refers to '51.234567'
lat = dbl(sCopy(geo, p6, 1));
// => lat := 51.234567;
Extraktion des Stringanfangs und -endes "sLeft", "sRight"
Stringanfang b und Stringende e der Länge l des Strings s können wie folgt als Kopie erhalten werden
b = sLeft(s,l);
e = sRight(s,l);
Entfernen eines Teilstrings "sErase"
Um eine Kopie eines Strings s zu erhalten, in der ein Teilstring entfernt wurde, kann folgendes verwendet werden
r = sErase(s, b); // Kopie der Zeichenkette s ohne Zeichen ab Position b
r = sErase(s, b, c); // Kopie der Zeichenkette s ohne Zeichen ab Position b der Länge c
r = sErase(s, BC); // BC ist ein Vektor der Länge 2, der b und c beinhaltet (Verhalten wie bei sErase(s, b, c)
r = sErase(s, BC, sel); // BC ist eine Matrix mit zwei Spalten, die zu b und c korrespondieren,
// wobei sel einen selektierenden Zeilenindex darstellt
Die Matrix BC ist an vielen Stellen das Ergebnis von Suchfunktionen, z.B. sFind(), die mehrere Treffer in dem String liefern können. Über den Index sel kann der entsprechende Textteil unmittelbar entfernt werden.
Einfügen eines Strings "sInsert"
Um einen String t innerhalb eines Strings s an Position b einzufügen und eine Kopie r zurückzuliefern, kann folgendes verwendet werden
r = sInsert(s, b, t);
Erzeugen, Formatieren, Lesen, Aufräumen
Extraktion numerischer Werte aus einem String "sScan"
Diese Funktion ist in Vorbereitung.
Um numerische Werte aus einem String s zu extrahieren und einen Vektor v dieser Werte zurückzuliefern, kann folgendes verwendet werden
v = sScan(f, s);
Hierbei stellt f einen Formatstring in der Art von scanf() dar.
Formatierung eines Strings "sFormat"
Um einen String f, der z.B. numerische Werte beinhaltet, als String r formatiert darzustellen, kann folgende Funktion benutzt werden
r = sFormat(f, ...);
Hierbei stellt f einen Formatstring in der Art von printf() dar, und es ist zu jedem Platzhalter ein korrespondierendes Argument der Form %[<width>][.<precision>]<type> anzugeben.
-
<width>: optionale Feldbreite für die Ausgabe, width < 0: linksbündig -
.<precision>: optional für f/g/e, Anzahl der Nachkommastellen oder gültigen Ziffern -
<type>: Die Argumente werden entsprechend des gewählten Ausgabetyps konvertiert. Zusätzliche Längenangaben für den Datentyp werden deshalb nicht benötigt.<type>Datentyp Ausgabe b <bool>Ausgabe von 'false' oder 'true' d <int>Ganzzahl mit Vorzeichen, Basis 10 u <uint>Ganzzahl ohne Vorzeichen, Basis 10 x, X <uint>Ganzzahl ohne Vorzeichen, Basis 16
kleine (x) oder große (X) ZiffernA-Fo <uint>Ganzzahl ohne Vorzeichen, Basis 8 f <dbl>Fließkommazahl ohne 10er-Exponent
Beispiel: 1234.5678g <dbl>Fließkommazahl in optimierter Darstellung
wie f oder e je nach Größenordnung der Zahl.
Beispiele: 1234.45678, 1.2345e9, 1.2345e-12e <dbl>Fließkommazahl mit 10er-Exponent
Beispiel: 1.2345678e3s <str>Text
Beispiel:
template = 'alt: %6.2f, lat: %.9f, lon: %.9f';
tx = sFormat(template, 140.4, 49.8765432, -3.14);
// tx := 'alt: 140.40, lat: 49.876543200, lon: -3.140000000';
Zugriff auf den Inhalt einer Ressource "sResource"
Die Funktion liefert den Inhalt der bezeichneten Ressource als konstanten (binären) String.
resStr = sResource({@ref:'myResource'});
Der Inhalt der Ressource kann je nach Konfiguration nicht nur reinen UTF-8-Text beinhalten (z.B. eine INI-Datei oder ein JSON-Objekt), sondern auch binäre Daten, wie double-Arrays, jpg-Images, etc. Insbesondere binäre Daten dürfen nur von geeigneten Spezialfunktionen weiter verarbeitet werden. Zur Implementierung solcher Funktionen sprechen sie uns gerne an.
Entfernen von Whitespace "sTrim"
Diese Funktion entfernt sämtlichen Whitespace am Anfang und Ende des Arguments, wie z.B. in
s_trimmed = sTrim(s);