OBS/Adminhilfe/RegularExpressions: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Für diese Seite wurde eine Zugriffsbeschränkung eingerichtet. Falls du diese Nachricht siehst, bist du nicht berechtigt, diese Seite einzusehen.
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 26: Zeile 26:


===Delphi===
===Delphi===
----
<source lang="Delphi">
<source lang="Delphi">
lIsEClass := TRegex.IsMatch(cMerkmalWert, '^[A-Z]{3}[0-9]{3}$');
lIsEClass := TRegex.IsMatch(cMerkmalWert, '^[A-Z]{3}[0-9]{3}$');
Zeile 36: Zeile 37:
*[http://docwiki.embarcadero.com/Libraries/Rio/de/System.RegularExpressions.TRegEx.IsMatch TRegEx.IsMatch]
*[http://docwiki.embarcadero.com/Libraries/Rio/de/System.RegularExpressions.TRegEx.IsMatch TRegEx.IsMatch]
*[http://docwiki.embarcadero.com/Libraries/Rio/de/System.RegularExpressions.TRegExOptions TRegExOptions]
*[http://docwiki.embarcadero.com/Libraries/Rio/de/System.RegularExpressions.TRegExOptions TRegExOptions]
----
<br />


===MySQL===
===MySQL===
----
In MySQL kann mit '''REGEXP''', '''REGEXP_LIKE''' oder '''RLIKE''' selektiert werden.
In MySQL kann mit '''REGEXP''', '''REGEXP_LIKE''' oder '''RLIKE''' selektiert werden.
<source lang="SQL">
<source lang="SQL">
Zeile 114: Zeile 116:
Die Angabe {0,1} lässt sich ebenfalls noch kürzer darstellen mit einem Fragezeichen
Die Angabe {0,1} lässt sich ebenfalls noch kürzer darstellen mit einem Fragezeichen
  [LPR]?[0-9]{5,6}
  [LPR]?[0-9]{5,6}
<br />
===Delphi===
===Delphi===
----
Mit der Matches-Methode von TRegEx, lässt sich eine Sammlung der Treffer auslesen. Die Sammlung ist ein Record mit Count und Item-Propery (siehe Links unter Codebeispiel).<br />
Mit der Matches-Methode von TRegEx, lässt sich eine Sammlung der Treffer auslesen. Die Sammlung ist ein Record mit Count und Item-Propery (siehe Links unter Codebeispiel).<br />
Da dies im Beispiel wohl in einer Query oder Liste laufen wird das Beispiel entsprechen mit Schleife:
Da dies im Beispiel wohl in einer Query oder Liste laufen wird das Beispiel entsprechen mit Schleife:
Zeile 143: Zeile 147:
*[http://docwiki.embarcadero.com/Libraries/Rio/de/System.RegularExpressions.TRegEx.TMatch TRegEx.TMatch]
*[http://docwiki.embarcadero.com/Libraries/Rio/de/System.RegularExpressions.TRegEx.TMatch TRegEx.TMatch]
*[http://docwiki.embarcadero.com/Libraries/Rio/de/System.RegularExpressions.TRegExOptions TRegExOptions]
*[http://docwiki.embarcadero.com/Libraries/Rio/de/System.RegularExpressions.TRegExOptions TRegExOptions]
<br />


===MySQL===
===MySQL===
----
Die MySQL-Funktion REGEXP_SUBSTR ermöglicht das Auslesen von Teilen des Wertes (Datenbankfeld?) im ersten Parameter. Die muss für ein Feld eventuell mehrmals ausgeführt werden, je nachdem, wie die Daten aussehen. Spannend ist dazu dann Parameter 4 "occurence". Hier die Optionalen Parameter ausgelistet:
Die MySQL-Funktion REGEXP_SUBSTR ermöglicht das Auslesen von Teilen des Wertes (Datenbankfeld?) im ersten Parameter. Die muss für ein Feld eventuell mehrmals ausgeführt werden, je nachdem, wie die Daten aussehen. Spannend ist dazu dann Parameter 4 "occurence". Hier die Optionalen Parameter ausgelistet:
*Parameter 3: pos -> Position, an der begonnen werden soll
*Parameter 3: pos -> Position, an der begonnen werden soll

Aktuelle Version vom 19. Februar 2024, 13:54 Uhr

Dies ist eine zugriffsgeschützte Seite.


Admin-Hilfe

OBS-Administration / Installation
kundenspezifische Anpassungen
OBS Protokolle
Shop-Administration

Kurze Erklärung zum Arbeiten mit Regulären Audrücken in Delphi und MySQL.

Arbeiten mit regulären Ausdrücken

Reguläre Ausdrücke sind ein Musterabgleich für Zeichenketten. Delphi und MySQL verfügen über eigene Funktionalitäten, um mit Regulären Ausdrücken zu arbeiten. Für die Erkennung muss ein entsprechendes Muster mitgegeben werden. Gute Beispiele finden sich in den externen Links für MySQL und regexr (bessere visuelle Darstellung).

ACHTUNG: Beim Arbeiten mit MySQL ist eventuell auf case-sensitive zu achten. Der Standard scheint case-insensitive zu sein (Set [A-Z] verhält sich wie [a-zA-Z]), weshalb die Verwendung von z. B. REGEXP nicht zum gewünschten Ergebnis führen kann, sondern REGEXP_LIKE mit entsprechendem "match_type"-Parameter genutzt werden muss! Der Parameter ist optional.

externe Links

Anwedungsbeispiele

EClass: Finden eines bestimmten Schemas

EClass definiert Codes für die Zuordnung von Texten und Warengruppenbezeichnungen in verschiedenen Sprachen und ermöglicht so den Datenaustausch von Artikeldaten über verschiedene Sprachen mit nur einer Datei.

Ident ist eine 6-stellige Zeichenkette mit drei Buchstaben gefolgt von drei Zahlen. Dies lässt sich mit entsprechenden Sets abbilden:

[A-Z][A-Z][A-Z][0-9][0-9][0-9]

Da dies aber recht lang werden kann, kann dies gekürzt werden. Dazu lässt sich die Wiederholung in geschweiften Klammern angeben. In diesem Fall ist es in beiden Fällen {3}.

[A-Z]{3}[0-9]{3}

Wenn wir jetzt noch Zeichenketten ignorieren möchten, die noch weitere Zeichen beinhalten (z. B. bei ABCD123456 würde BCD123 dem Muster entsprechen), geben wir jetzt noch an, dass diese sechs Zeichen auch die vollständige Zeichenkette mit Beginn (^) und Ende ($) ist.

^[A-Z]{3}[0-9]{3}$


Ein anderer Fall wäre der Irdi-Wert. Dieser setzt sich aus anderen Angaben zusammen und sieht so aus: 123-4#56-ABC789#123. Neben Sets lasen sich feste Zeichen auch einfach als solche angeben. In diesem Fall Minus und Raute/Hashtag. Dies könnte dann wie folgt aussehen:

^[0-9]{4}-[0-9]#[0-9]{2}-[A-Z]{3}[0-9]{3}#[0-9]{3}$


Delphi


lIsEClass := TRegex.IsMatch(cMerkmalWert, '^[A-Z]{3}[0-9]{3}$');

Beispieldaten:

cMerkmalWert = 'WDA057' -> lIsEClass = true;
cMerkmalWert = 'BRUNNEN' -> lIsEClass = false;


siehe auch:


MySQL


In MySQL kann mit REGEXP, REGEXP_LIKE oder RLIKE selektiert werden.

SELECT mm_classificationsystem, mm_classmerkmalwert
FROM m_merkmale
WHERE mm_classmerkmalwert REGEXP '^[A-Z]{3}[0-9]{3}$';

SELECT mm_classificationsystem, mm_classmerkmalwert
FROM m_merkmale
WHERE mm_classmerkmalwert RLIKE '^[A-Z]{3}[0-9]{3}$';

SELECT mm_classificationsystem, mm_classmerkmalwert
FROM m_merkmale
WHERE REGEXP_LIKE(mm_classmerkmalwert, '^[A-Z]{3}[0-9]{3}$');

SELECT mm_classificationsystem, mm_classmerkmalwert
FROM m_merkmale
WHERE REGEXP_LIKE(mm_classmerkmalwert, '^[A-Z]{3}[0-9]{3}$', 'c'); #case-sensitive (siehe Hinweis unter Punkt 1)

SELECT mm_classificationsystem, mm_classmerkmalwert
FROM m_merkmale WHERE
REGEXP_LIKE(mm_classmerkmalwert, '^[A-Z]{3}[0-9]{3}$', 'i'); #case-insensitive

Beispieldaten:

mm_classificationsystem mm_classmerkmalwert
ECLASS-6.2 CAA133
ECLASS-6.2 weiß
ECLASS-10.1 BRUNNEN
ECLASS-6.2 DAA349
ECLASS-7.1 orange

gefiltert mit regulären Ausdrücken:

mm_classificationsystem mm_classmerkmalwert
ECLASS-6.2 CAA133
ECLASS-6.2 DAA349


siehe auch:

Teil-String anhand eines bestimmten Schemas auslesen

Nehmen wir an, wir haben eine Auflistung mit Vorgangsnummer für Aufträge und Reparaturaufträge und den Kundennamen als einzelne Zeichenkette und mögliche weitere Informatioen am Ende der Zeichenkette. Auch ist die Formatierung nicht durchgängig.

Max Mustermann R13687
Muster GmbH 238077 Herr Muster
R90222 Boris Beispiel
Moritz Musterknabe Auftrag 302248/storniert

Um an die Vorgangsnummern zu kommen, lässt sich wieder mit regulären Ausdrücken arbeiten. Delphi und MySQL haben sogar beide die Möglichkeit entsprechende Zeichenketten anhand eines Musters zu extrahieren. Aber zunächst einmal wieder die Definition eines passenden Ausdrucks zur Erkennung der Vorgangsnummern. Reparaturaufträge bekommen als führendes Zeichen immer ein R. Werden Produktionsaufträge verwendet, sind auch P als mögliches Zeichen in der Auflistung zu finden. Mit Lageraufträgen kommt noch ein L hinzu. Entsprechend kann das Set für den führenden Buchstaben angegeben werden oder man sucht nach Vorgangstyp entsprechen einzeln.

HINWEIS: Die Anzahl an Zahlen sollte entsprechend der Vorgangslänge gesetzt werden (Base.Util VorgangLen())! Beispiele hier mit Default 6, bei führenden Buchstaben wie bei Repas also 5.


Nur Repas:

R[0-9]{5}

Nur Produktionsaufträge:

P[0-9]{5}

Nur Lageraufträge:

L[0-9]{5}

Wollten wir dies zusammenfassen in einem Set:

[LPR][0-9]{5}

Und was ist mit Aufträgen?

[0-9]{6}

Und wenn wir daraus eine Abfrage machen möchten? Hier lassen Reguläre ausdrücke auch variable Mengenangaben zu. Ein Bereich wäre z. B. {5,6} für 5 bis 6 vorkommen. So lässt sich auch die Suche über alle Auftragstypen kombinieren.

[LPR]{0,1}[0-9]{5,6}

Die Angabe {0,1} lässt sich ebenfalls noch kürzer darstellen mit einem Fragezeichen

[LPR]?[0-9]{5,6}


Delphi


Mit der Matches-Methode von TRegEx, lässt sich eine Sammlung der Treffer auslesen. Die Sammlung ist ein Record mit Count und Item-Propery (siehe Links unter Codebeispiel).
Da dies im Beispiel wohl in einer Query oder Liste laufen wird das Beispiel entsprechen mit Schleife:

        while (not qQuery.Eof) do begin

            rMatches := TRegEx.Matches(qQuery.A2C('db_feld'), '[LPR]?[0-9]{5,6}');

            for var i := 0 to rMatches.Count-1 do begin

                cMatch := rMatches.Item[i].Value;
                //hier irgendetwas mit dem Wert in cMatch machen

            end;

            qQuery.Next;
        end;

Entsprechend des Beispiels sollte dies dann im Ergebnis für jeden Datensatz genau ein Eintrag in rMatches enthalten sein. Der Wert ist dann entsprechend:

R13687
238077
R90222
302248

siehe auch:


MySQL


Die MySQL-Funktion REGEXP_SUBSTR ermöglicht das Auslesen von Teilen des Wertes (Datenbankfeld?) im ersten Parameter. Die muss für ein Feld eventuell mehrmals ausgeführt werden, je nachdem, wie die Daten aussehen. Spannend ist dazu dann Parameter 4 "occurence". Hier die Optionalen Parameter ausgelistet:

  • Parameter 3: pos -> Position, an der begonnen werden soll
  • Parameter 4: occurence -> der x-te werte, der genommen werden soll
  • Parameter 5 match_type -> Vorgabe wie der Abgleich stattfinden soll
SELECT REGEXP_SUBSTR(db_feld, '[LPR]?[0-9]{5,6}') FROM db_table;
SELECT REGEXP_SUBSTR(db_feld, '[LPR]?[0-9]{5,6}', 1, 1, 'c') FROM db_table; #case-sensitive (siehe Hinweis unter Punkt 1)

Entsprechend des Beispiels sollte dies dann im Ergebnis für die Spalte sie folgt aussehen:

R13687
238077
R90222
302248

siehe auch: