Code-Beispiel
Komplexe Suchfunktion (regular expressions)
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
GPLv3 | TJF | 24.09.2014 |
Die Suche nach Zeichenketten kann mit den FB-Befehlen INSTR bzw. INSTRREV programmiert werden, zumindest für den Fall, dass exakte Übereinstimmung der gesuchten Zeichenkette gefordert ist.
Nicht selten kommt es jedoch vor, dass bestimmte Teile der gesuchten Zeichenkette flexibel sein sollen. So könnte z. B. nur nach Wörtern gesucht werden, an deren Ende eine einzige Ziffer steht, oder mehrere Ziffern, oder in deren Mitte mindestens ein Unterstrich vorhanden ist oder die nur aus Großbuchstaben bestehen. Diese Aufgaben lassen sich mit den "Bordmitteln" von FreeBasic nicht so einfach lösen. Vielmehr bietet sich hier die Verwendung von reglären (Such-) Ausdrücken an, die aus der textorientierten Programmiersprache PERL bekannt sind.
In FB können reguläre Ausdrücke durch Einbindung externer Bibliotheken verfügbar gemacht werden, z. B. unter Verwendung von GLib. Das folgende Beispiel lädt die Datei g_regex.bas in den Speicher und durchsucht diese mithilfe des regulären Ausdruckes
"\b[A-Z]+\b"
nach Wörtern, die ausschließlich aus Großbuchstaben bestehen. Diese werden dann auf dem Bildschirm ausgegeben. Wird der Quelltext also unter dem Namen g_regex.bas abgespeichert, kompiliert und ausgeführt, so analysiert das Programm seinen eigenen Quelltext und gibt alle Wörter aus, die in Großbuchstaben geschrieben sind.
'/* Print all uppercase-only words. */
'
' Example translated from GLib Reference Manual
' by TJF, licence GPLv3
'
#INCLUDE ONCE "glib.bi"
SUB print_uppercase_words CDECL( _
BYVAL string_ AS CONST gchar PTR)
VAR regex = g_regex_new ("\b[A-Z]+\b", 0, 0, NULL)
DIM AS GMatchInfo PTR match_info
DIM AS GError PTR error_ = NULL
g_regex_match_full (regex, string_, -1, 0, 0, @match_info, @error_)
WHILE g_match_info_matches (match_info)
VAR word = g_match_info_fetch (match_info, 0)
g_print (!"Found: %s\n", word)
g_free (word)
g_match_info_next (match_info, @error_)
WEND
g_match_info_free (match_info)
g_regex_unref (regex)
IF error_ THEN
g_printerr (!"Error while matching: %s\n", error_->message)
g_error_free (error_)
END IF
END SUB
VAR filen = "g_regex.bas", fnr = FREEFILE
IF OPEN(filen FOR INPUT AS #fnr) THEN
?"Cannot open " & filen
ELSE
VAR t = STRING(LOF(fnr), 0)
GET #fnr, , t
CLOSE #fnr
print_uppercase_words(SADD(t))
END IF
Hinweis für wondiws Anwender:
Die Binaries (GLib.dll) können an einfachsten mit einem GTK-Installer geladen bzw. installiert werden:
http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 29.09.2012 von TJF angelegt.
- Die aktuellste Version wurde am 24.09.2014 von TJF gespeichert.
|
|