tuple_regexp_match
— Extrahieren von Teilen aus Zeichenketten mit Hilfe von regulären Ausdrücken.
tuple_regexp_match( : : Data, Expression : Matches)
tuple_regexp_match
wendet den regulären Ausdruck Expression
auf eine oder mehrere Zeichenketten in Data
an und liefert jeweils die
erste dem Suchmuster entsprechende Teilzeichenkette in Matches
zurück.
In der Regel wird eine Ausgabezeichenkette pro Eingabezeichenkette zurückgegeben,
wobei die Zeichenketten leer sind, wenn keine Übereinstimmung gefunden wurde.
Falls der reguläre Ausdruck jedoch Gruppen mit Teilergebnissen (siehe unten)
enthält, hängt das Verhalten von der Anzahl der Eingabezeichenketten ab:
Gibt es nur eine Eingabe, so ist das Ergebnis das Tupel aller Teilzeichenketten,
die dem Suchmuster einer Gruppe entsprechen. Gibt es mehrere Eingaben,
so wird für jede Eingabe das Ergebnis der ersten Gruppe zurückgegeben.
Eine Zusammenfassung der Syntax regulärer Ausdrücke folgt. Grundsätzlich steht jedes Zeichen im Suchmuster als Literal für ein entsprechendes Zeichen in den Eingabedaten, wobei jedoch die nachfolgend aufgeführten Symbole eine spezielle Bedeutung haben (die beschriebene Syntax ist kompatibel zu Perl):
^ Steht für den Anfang der Zeichenkette $ Steht für das Ende der Zeichenkette, ggf. inklusive einem Newline als letztes Zeichen . Steht für jedes Zeichen außer Newline [...] Steht für jedes in den eckigen Klammern aufgeführte Literal. Ist das erste Zeichen ein '^', so ist der Ausdruck negiert. Mit dem Zeichen '-' kann man Wertebereiche angeben wie in '[A-Z0-9]'. Andere Zeichen verlieren ihre spezielle Bedeutung innerhalb eckiger Klammern, außer '\'. Innerhalb der eckigen Klammern können die folgenden POSIX Zeichenklassen verwendet werden (dabei ist zu beachten, dass die eckigen Klammern um den Klassennamen zusätzlich angegeben werden müssen): [:alnum:] Ziffern und Buchstaben [:alpha:] Buchstaben [:blank:] Leerzeichen und Tab [:cntrl:] Steuerzeichen [:digit:] Ziffern [:graph:] Alle druckbaren Zeichen ohne Leerzeichen [:lower:] Kleinbuchstaben [:print:] Alle druckbaren Zeichen einschließlich Leerzeichen [:punct:] Interpunktionszeichen [:space:] Alle Whitespace-Zeichen ([:blank:], Zeilenumbrüche, ...) [:upper:] Großbuchstaben [:xdigit:] Für Hexadezimalzahlen verwendete Buchstaben und Ziffern (0-9a-fA-F). * Erlaubt 0 oder mehr Wiederholungen des vorhergehenden Literals / Gruppe + Erlaubt 1 oder mehr Wiederholungen ? Erlaubt 0 oder 1 Wiederholung {n,m} Erlaubt n bis m Wiederholungen {n} Erlaubt genau n Wiederholungen Die obigen Wiederholungsquantifikatoren sind im Normalfall "gierig", d.h. es wird die maximal mögliche Übereinstimmung gesucht. Mit einem zusätzlichen ? wird die minimale Übereinstimmung gesucht, z.B. +? | Trennt alternative Suchausdrücke ( ) Gruppiert einen Unterausdruck und speichert ein Teilergebnis. (?: ) Reine Gruppierung (z.B. für Wiederholungen) ohne Teilergebnis. (?= ) Positive Vorausschau (lookahead, notwendige Bedingung rechts vom Match) (?! ) Negative Vorausschau (lookahead, unerlaubte Bedingung rechts vom Match) (?<= ) Positive Zurückschau (lookbehind, notwendige Bedingung links vom Match) (?<! ) Negative Zurückschau (lookbehind, unerlaubte Bedingung links vom Match) \ Escape-Zeichen, erlaubt die Verwendung eines Symbols mit spezieller Bedeutung als Literal. Achtung: Manche Sprachen wie HDevelop und C/C++ verwenden den Backslash bereits als allgemeines Escape-Zeichen für Zeichenketten. In diesem Fall steht '\\.' für ein Punktliteral und '\\\\' für ein Backslashliteral. Darüber hinaus gibt es einige Sequenzen mit spezieller Bedeutung (wobei die groß geschriebene Variante jeweils die Negation darstellt): \d,\D Steht für Ziffern \w,\W Steht für Ziffern, Buchstaben und Unterstrich \s,\S Steht für Leerraum (Whitespace) \b,\B Steht für eine Wortgrenze
Falls der angegebene Ausdruck syntaktisch inkorrekt ist, wird als
Fehler ein falscher Wert im Steuerparameter 2 bemängelt. Zusätzliche
Informationen erhält man in einem Benachrichtigungsfenster, wenn
set_system('do_low_error', 'true')
gesetzt ist, oder aber in der
Ausgabekonsole von HDevelop.
Weiterhin lassen sich einige Optionen setzen, indem man für
Expression
ein Tupel übergibt. In diesem Fall wird
das erste Element als regulärer Ausdruck behandelt, und jedes weitere
Element als Option.
'ignore_case' : Ignorieren von Groß- und Kleinschreibung
'multiline' : '^' und '$' stehen für Start und Ende einzelner Zeilen
'dot_matches_all' : '.' steht auch für Newlines
'newline_lf' , 'newline_crlf' , 'newline_cr' : Kodierung von Newlines in den Eingabedaten. Als Default wird auf allen Systemen LF verwendet (obwohl in Windows-Dateien normalerweise CRLF als Zeilenumbruch verwendet wird, werden beim Einlesen dieser Dateien die Zeilenumbrüche i.d.R. in '\n' umgewandelt, was dem LF entspricht).
Für allgemeine Informationen zu String-Operationen siehe auch Tupel / String-Operationen.
Falls der Eingabeparameter Data
ein leeres Tupel ist, gibt der
Operator ein leeres Tupel zurück.
Wenn Expression
ein leeres Tupel ist, wird ein Fehler zurückgegeben.
Die Auswertung der regulären Ausdrücke berücksichtigt Unicode Codepoints.
Ein Codepoint kann aus mehreren Bytes im UTF-8 String zusammengesetzt sein.
Wenn die Auswertung der regulären Ausdrücke sich auf die Bytes des Strings
beziehen soll, kann dieser Operator mit
set_system('tsp_tuple_string_operator_mode', 'byte')
in einen
Byte-Modus umgeschaltet werden. Wenn 'filename_encoding' auf
'locale' gesetzt ist (legacy), verwendet dieser Operator immer den
Byte-Modus.
HDevelop unterstützt eine Inline-Operation für tuple_regexp_match
,
die innerhalb eines Ausdrucks in der folgenden Syntax verwendet werden
kann:
Matches := regexp_match(Data, Expression)
Data
(input_control) string(-array) →
(string)
Eingabezeichenketten, auf die das Suchmuster angewendet wird
Expression
(input_control) string(-array) →
(string)
Regulärer Ausdruck.
Defaultwert: '.*'
Wertevorschläge: '.*' , 'ignore_case' , 'multiline' , 'dot_matches_all' , 'newline_lf' , 'newline_crlf' , 'newline_cr'
Matches
(output_control) string(-array) →
(string)
Dem Suchmuster entsprechende Teilzeichenketten
tuple_regexp_match ('abba', 'a*b*', Result) * Returns 'abb' tuple_regexp_match ('abba', 'b*a*', Result) * Returns 'a' tuple_regexp_match ('abba', 'b+a*', Result) * Returns 'bba' tuple_regexp_match ('abba', '.a', Result) * Returns 'ba' tuple_regexp_match ('abba', '[ab]*', Result) * Returns 'abba' tuple_regexp_match (['img123','img124'], 'img(.*)', Result) * Returns ['123','124'] tuple_regexp_match ('mydir/img001.bmp', 'img(.*)\\.(.*)', Result) * Returns ['001','bmp']
tuple_regexp_replace
,
tuple_regexp_test
,
tuple_regexp_select
Perl Compatible Regular Expressions (PCRE), http://www.pcre.org/
Foundation