CXI-Basis-Programmierreferenz / Version 2 / Tools / Hilfsfunktionen /
int cxiMatchesWildCard (const char *name, const char *wild)
Abgleich eines Namens mit einer Jokerzeichen-Spezifikation
name:
Zu überprüfender Name (muss mindestens ein Zeichen lang sein)
wild:
Spezifikation, die Jokerzeichen enthalten kann (NULL entspricht "*")
return:
1, wenn der Name zur Spezifikation passt;
0, wenn der Name nicht zur Spezifikation passt
Diese Funktion überprüft, ob die Spezifikation 'wild' auf den übergebenen String 'name' zutrifft.
Die Jokerzeichen-Spezifikation <GesamtAusdruck> wird durch die folgenden Syntaxdiagramme beschrieben:
<GesamtAusdruck> ::= <UndAusdruck> { '|' <UndAusdruck> }
<UndAusdruck> ::= <NichtAusdruck> { '&' <NichtAusdruck> }
<NichtAusdruck> ::= <BasisAusdruck> || '!' <BasisAusdruck>
<BasisAusdruck> ::= <BasisSymbol> { <BasisSymbolOder!> }
<BasisSymbolOder!> ::= <BasisSymbol> || '!'
<BasisSymbol> ::= '*' || '?' || <Zeichen>
{ ... } bedeutet beliebig häufige Wiederholung (auch null-mal), Terminalzeichen sind durch einfache Anführungszeichen gekennzeichnet, <Zeichen> ist jedes in einem Variablen- oder Dateinamen zulässige Zeichen mit Ausnahme der obigen Sonderzeichen '|', '&', '!', '*', '?'.
Die gesamte Spezifikation ist zutreffend, wenn
von den durch '|' getrennten Teilstrings mindestens einer zutrifft,
von den durch '&' getrennten Teilstrings alle zutreffen,
ein durch '!' eingeleiteter Teilstring nicht zutrifft.
Der Operator '!' hat Vorrang vor '&', '&' hat Vorrang vor '|'.
Das '?' repräsentiert genau ein beliebiges Zeichen in 'name',
der '*' steht für beliebig viele (auch null) beliebige Zeichen.
Groß- und Kleinschreibung wird nicht berücksichtigt.
Leerzeichen werden nicht ignoriert, sie sind an jeder Stelle signifikant!
Die Spezifikation ist also eine UND-/ODER-/NICHT-Verknüpfung von Basisausdrücken, die jeweils eine Maske mit den von Dateinamen bekannten Zeichen '*' und '?' darstellen. Achtung: Ein Basisausdruck kann mehrere '*' enthalten; mehrere direkt aufeinander folgende '*' sind gleichbedeutend mit einem.
Beispiele:
Bei den folgenden Spezifikationen ist jeweils angegeben, für welche Namen diese Funktion TRUE (1) zurückgibt:
"*": Alle Namen.
"?": Alle Namen, die aus genau einem Zeichen bestehen.
"*.*": Alle Namen, die mindestens einen Punkt enthalten.
"!*": Kein Name.
"!*.*": Alle Namen, die keinen Punkt enthalten.
"*!.*": Alle Namen, die mindestens einmal die Zeichenfolge "!." enthalten.
"*.*!": Alle Namen, die mindestens einen Punkt enthalten und (gleichzeitig) mit '!' enden.
"a": Nur der Name "a" (oder "A").
"!a": Alle Namen außer "a".
"a!": Nur der Name "a!".
"a?": Alle Namen aus zwei Zeichen, die mit 'a' beginnen.
"?a*": Alle Namen, deren zweites Zeichen 'a' ist.
"!?a*": Alle Namen, deren zweites Zeichen nicht 'a' ist (auch einstellige Namen).
"a*": Alle Namen, die mit 'a' beginnen (auch "a" selbst).
"!a*": Alle Namen, die nicht mit 'a' beginnen.
"*a": Alle Namen, die mit 'a' enden (auch "a" selbst).
"!*a": Alle Namen, die nicht mit 'a' enden.
"*a*": Alle Namen, die mindestens ein 'a' enthalten (auch "a" selbst).
"!*a*": Alle Namen, die kein 'a' enthalten.
"a*a": Alle Namen, die mit 'a' beginnen und mit 'a' enden (nicht "a" selbst).
"a*&*a": Alle Namen, die mit 'a' beginnen und mit 'a' enden (auch "a" selbst).
"a*b": Alle Namen, die mit 'a' beginnen und mit 'b' enden.
"a*&*b": Alle Namen, die mit 'a' beginnen und mit 'b' enden.
"!a*&*b": Alle Namen, die nicht mit 'a' beginnen und die mit 'b' enden (auch "b" selbst).
"a?*b": Alle Namen, die mit 'a' beginnen und mit 'b' enden und mindestens drei Zeichen lang sind.
"a*&*b&???*": Alle Namen, die mit 'a' beginnen und mit 'b' enden und mindestens drei Zeichen lang sind.
"a*|*b": Alle Namen, die mit 'a' beginnen oder mit 'b' enden (oder beides).
"*ab*": Alle Namen, die mindestens einmal die Zeichenfolge "ab" enthalten.
"*ab*ab*": Alle Namen, die mindestens zweimal die Zeichenfolge "ab" enthalten.
"!*ab*ab*": Alle Namen, die höchstens einmal die Zeichenfolge "ab" enthalten.
"*ab*&!*ab*ab*": Alle Namen, die genau einmal die Zeichenfolge "ab" enthalten.
"*a*b*": Alle Namen, die mindestens ein 'a' und danach mindestens ein 'b' enthalten.
"*a*&*b*": Alle Namen, die mindestens ein 'a' und mindestens ein 'b' enthalten.
"*a*|*b*": Alle Namen, die mindestens ein 'a' oder mindestens ein 'b' enthalten (oder beides).
"a*&!ab*": Alle Namen, die mit "a", aber nicht mit "ab" beginnen.
"!ab*&a*": Alle Namen, die mit "a", aber nicht mit "ab" beginnen.
"2b|!2b": Alle Namen.
Portabilität:
Diese Funktion ist ab Version 2.03 definiert und in allen unterstützten Systemen verfügbar.
Siehe auch:
MergeWild - Selektives Mischen
FindOpen - Suchschleife über Variablennamen