Suche das erste Auftreten des Strings search im String str.
Suche das erste Auftreten des Strings search im String str. Die Funktion gibt die Zeichen-Position im String zurück, an der der gesuchte Unterstring beginnt. Wird der Unterstring nicht gefunden, ergibt der Aufruf -1.
Name | Typ | Default | Beschreibung |
Return | int | 0-basierte Zeichen-Position im String, an der das gesuchte Unterstring beginnt. -1 : Zeichen nicht gefunden | |
str | char* | - | Zeichenkette, die durchsucht werden sol |
search | char* | - | Suche nach diesem Unterstring. Muss ungleich "" sein. [Ab v3.2.3 R2600, 08.08.2011] Der String darf ein regulärer Ausdruck sein. Der String muss in diesem Fall mit den Pärfix "regexp:" beginnen. [Ab v3.3 R4000, 4. Jul 2013] Bei Verwendung des Präfixes "pcre:" ('perl compatible regular expressions') wird eine neuere Implementierung zur Berechnung regulärer Ausdrücke verwendet. Wir empfehlen die Verwendung dieses Verfahrens. Die alte Implementierung bleibt aus Gründen der Rückwärtskompatibilität erhalten. Ab v3.4 R9000 und CS5 werden reguläre Ausdrücke ausschließlich durch PCRE verarbeitet. Mit regexp: markierte Ausdrücke werden automatisch an PCRE weitergeleitet. Lediglich CS4 verwendet weiter die alte Implementierung für GNU-kompatible reguläre Ausdrücke. |
startPos | int | 0 | (nur bei Verwendung regulärer Ausdrücke) Durchsuche den String ab dieser Zeichenposition |
matchlen | int* | 0 | (nur bei Verwendung regulärer Ausdrücke) Länge des gefundenen Ausdruckes in Zeichen |
matches | int* | 0 | (nur bei Verwendung regulärer Ausdrücke) int-Array mit Angaben über das gefundene Ergebnis Das Array enthält jeweils Startposition und Länge des nächsten gefundenen Ausdruckes. Im ersten Zahlenpaar stehen die Angaben für den gesamten Ausdruck. Die folgenden Paare enthalten jeweils die Angaben des i-ten Unterausdruckes. Unterausdrücke sind die in runde Klammern eingeschlossenen Teile des regulären Ausdruckes, also etwa ([a-z]{3,7}). Abgeschlossen wird das Feld durch das Paar (-1, 0). Beachten Sie bitte, dass Unterausdrücke durchaus die Länge 0 liefern können. Wird der reguläre Ausdruck ([0-9])([a-z]{0,7})([0-9])) auf den Text "14" angewendet, ist nämlich der zweite Ausdruck leer. Bei einer Angabe ungleich 0 muss das Array mind. um 4 größer sein als die doppelte Anzahl der Klammerausdrücke im regulären Ausdruck - jeweils zwei int's für den Starteintrag, die n Subentries und die Ende-Markierung. Eine einfache Definition eines Matches-Arrays für einen regulären Ausdruck mit 4 Untereinträgen. int matches [6]; |
compile_options | int | 0 | Zusatzoptionen beim Kompilieren des regulären Ausdruckes, siehe hier |
study_options | int | 0 | Zusatzoptionen beim Untersuchen des kompilierten regulären Ausdruckes, siehe hier |
exec_options | int | 0 | Zusatzoptionen beim Suchen des regulären Ausdruckes, siehe hier |
strcpy (str, "Matthias"); strstrpos (str, "hi") ergibt 4
Unterschiedliches Einfärben aller Wörter des Textes. Achten Sie darauf, dass für das Färben Zeichenpositionen benötigt werden!
int get_color (int * i, int * r, int * g, int * b) { if (*i > 8) *i = 0;
if (*i == 0) {*r = 100; *g = 149; *b = 23; } if (*i == 1) {*r = 210; *g = 105; *b = 30; } if (*i == 2) {*r = 255; *g = 99; *b = 71; } if (*i == 3) {*r = 255; *g = 215; *b = 0; } if (*i == 4) {*r = 216; *g = 191; *b = 216; } if (*i == 5) {*r = 175; *g = 238; *b = 238; } if (*i == 6) {*r = 173; *g = 255; *b = 47; } if (*i == 7) {*r = 0; *g = 191; *b = 255; } if (*i == 8) {*r = 218; *g = 165; *b =32; }
*i = *i + 1; return 1; }
int main () { String str = string::alloc (); char regex [20000]; char tmp [20000]; char sub [20000]; int startPos = 0; int matchlen; int matches [400]; int i, m = 0, cc = 0; int r, g, b; int slen;
strcpy (regex, "pcre:[^[:space:][:punct:]//.]+");
frame::gettext (gFrame, str); strcpy (tmp, string::get (str));
slen = strlen (tmp); while (1) { startPos = strstrpos (tmp, regex, startPos, &matchlen, matches); if (startPos < 0) break; m = m+1;
i = 0; while (matches[i*2] >= 0 && matches[(i*2)+1] >= 0) { strcpy (sub, tmp, matches[i*2], matches[i*2+1]); wlog ("", "Token %d/%d : [%d, %d]\n", m, i, matches[i*2], matches[i*2]+matches[i*2+1]); wlog ("", " '%s'\n", sub);
get_color (&cc, &r, &g, &b); textmodel::set_color_rgb ( frameB, matches[i*2], matches[i*2+1], r, g, b); i = i+1; }
if (matchlen == 0) startPos = startPos +1; else startPos = startPos + matchlen; }
return 0; }
Eine Testdatei (CS5.5) für reguläre Ausdrücke finden Sie hier:
Testdatei
Dieses Beispiel funktioniert nicht mit "regexp:" sondern nur mit "pcre:".
int main () { char str [512]; int pos = 0; int matchlen;
strcpy (str, "abc11188888#defgh11177777#hijklmn11166666#opqäöü11155555#qwertzu11144444#XYZ");
while (1) { pos = strstrpos (str, "pcre:([0-9]{6})(#)", pos, &matchlen); if (pos<0) break;
wlog ("", "[%d, %d] : '%s'\n", pos, matchlen, strsubstring (str, pos, matchlen));
pos += matchlen + 1; }
return 0; }
Alphabetic index HTML hierarchy of classes or Java