Unterstützung bei kleinem RegEx

CaptainPighead

Lieutenant
Registriert
Jan. 2024
Beiträge
523
Hallo zusammen,

kann mir jemand mit einem RegEx evtl. kurz unter die Arme greifen? Ist für eine Kategorisierungsregel eines Finanzprogramms. Ich hab jetzt schon eine Weile rumgetestet mit regexr.com, kriege es aber trotzdem nicht hin. Bin leider mit regexen noch ein wenig Anfänger.

Ich möchte auf folgende Strings matchen (case-insensitive):

Code:
bäcker
baecker
baeckerei
backshop

Meine erste Idee war irgendwie in die Richtung

Code:
^back* | ^b[äae]cker*
oder vielleicht noch kürzer ?:
Code:
^b[äacke]*

Fragen:
[äacke] matched ja nur auf einen Buchstaben. Wie lautet die Syntax wenn ich eine beliebige Anzahl der definierten Zeichen in [ ] matchen lassen möchte? Das habe ich nicht rausfinden können. Und: welcher ist der Operator anstatt das "*", damit noch ein beliebig langes Wort kommen darf (wie "shop" für back)?

Wahrscheinlich für die RegEx Gurus hier trivial - würde mich freuen!
 
  • Gefällt mir
Reaktionen: CyborgBeta
Vielen lieben Dank! Ganz stark. @JumpingCat : es sollten nur die 4 Strings aus meinem Post matchen (keine case-sensitivity), alles was davon abweicht nicht. regex101.com kannte ich noch nicht - dachte bisher, das regexr.com die ultimative Seite zum Austesten ist.

Ich werde mal mit Euren Ausdrücken etwas rumspielen und testen - man lernt nie aus, gerade bei Regulären Ausdrücken. Danke für Eure Hilfe 💪
 
  • Gefällt mir
Reaktionen: CyborgBeta
Fur sowas ist chatgpt/eine KI ganz interessant ;)
 
  • Gefällt mir
Reaktionen: Gee858eeG
Du willst "bäcker", "bäckerei", "backshop" und die Umlaute abdecken.
Es geht bei einem RegEx nicht nur darum, alles auf der Liste zu treffen, sondern auch darum, dass nichts anderes mit durchschlüpft - wie z.B. bäckshop.
"backshop" sollte einzeln stehen, da es das einzige Wort ist, das auf "shop" endet und keinen Umlaut hat.

Musst du noch in dein Sprach-entsprechendes Pattern (case-insensitive, word break) bringen:
(b(ä|ae)cker(ei)?|backshop) oder b((ä|ae)cker(ei)?|ackshop) <== sieht irgendwie nach Lackshop/Kackshop aus! :evillol:
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: CaptainPighead und CyborgBeta
CyborgBeta schrieb:
Nein, die kann das (noch) nicht.

Dann halt deepseek (ohne DeepThink):

Ich möchte auf folgende Strings matchen (case-insensitive):

Code:
bäcker
baecker
baeckerei
backshop
Um auf die gegebenen Strings case-insensitive zu matchen, können wir einen regulären Ausdruck verwenden, der alle Varianten berücksichtigt. Hier ist eine Lösung:

Regulärer Ausdruck:
Code:
\b(?:bä|ae)cker(?:ei)?|backshop\b

Erklärung:
  • \b - Wortgrenze (stellt sicher, dass wir ganze Wörter matchen)
  • (?:bä|ae) - nicht erfassende Gruppe für "bä" oder "ae"
  • cker - matcht "cker"
  • (?:ei)? - optionales "ei" (für "bäckerei"/"aeckerei")
  • | - ODER
  • backshop - matcht genau "backshop"
  • \b - Wortgrenze am Ende

Dieser Ausdruck matcht alle vier Beispiele case-insensitive (wenn die Case-Insensitive-Flag gesetzt ist).

In verschiedenen Programmiersprachen würde das so aussehen:

JavaScript:
Javascript:
const regex = /\b(?:bä|ae)cker(?:ei)?|backshop\b/gi;

Python:
Python:
import re
regex = re.compile(r'\b(?:bä|ae)cker(?:ei)?|backshop\b', re.IGNORECASE)

PHP:
PHP:
$regex = '/\b(?:bä|ae)cker(?:ei)?|backshop\b/i';

Ich finde die Antwort ganz ordentlich.
 
JumpingCat schrieb:
Ich finde die Antwort ganz ordentlich.
Das matcht auch den Acker: https://regex101.com/r/MgljwR/1 😬
Ergänzung ()

Also, eine KI kann eben nur "ungefähr richtige Antworten" geben, und das ist bei regulären Ausdrücken ganz schlecht ... es sei denn, man überprüft sie noch einmal genau.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: JumpingCat
CaptainPighead schrieb:
es sollten nur die 4 Strings aus meinem Post matchen (keine case-sensitivity), alles was davon abweicht nicht

Warum dann überhaupt Regex? Das geht doch effizienter mit einer .Contains-, IN- o.ä.-Funktion?
Ansonsten hätte ich als Reviewer ausschließlich die Antwort von Post #13 akzeptiert (allerdings mit ^ und $ oder whitepace-Prüfung, je nachdem ob der Suchstring noch andere Wörter enthalten kann). Simple Probleme "outsmarten" zu wollen bringt nichts als Fehler.
 
@CyborgBeta Deine Lösung ist noch viel "falscher". Match auf "bäck" und ähnliches. #13 ist fast richtig, es fehlt nur der Ausschluss von "noch was dran" - schrieb ich bereits.
 
  • Gefällt mir
Reaktionen: BeBur
Na, dann halt so: (?i)(b(ä|ae)cker(ei)?|backshop) https://regex101.com/r/UlR7fT/1

Das ist zu 100 % richtig.

@CaptainPighead hat ja erst in #6 geschrieben, dass er alles andere nicht will.
Ergänzung ()

Und, wenn das alleine in einer Zeile stehen soll, dann noch ^ und $ drumherum - oder \b, wenn davor/danach ein Leerzeichen/nichts stehen muss.
 
Zuletzt bearbeitet:
CyborgBeta schrieb:
Btw. Welcher Dialekt denn überhaupt?
Die Frage sollte der TE vielleicht als allererstes beantworten - denn ausnahmslos alle "Lösungen", die hier gepostet wurden sind keine Regular Expressions, sondern basieren auf irgendwelchen Erweiterungen, die meisten erfordern sogar Perl Compatible Regular Expressions (PCRE), die sich zwar irgendwie als Quasi-Standard herausgebildet haben, aber eben nicht immer und überall funktionieren. Bei dem Umlaut ist es darüberhinaus noch wichtig, in welchem Encoding die Daten vorliegen und wie die Regex Engine das interpretiert.

Ohne Extender Regular Expressions (also das mit der Oder Verknüpfung )lässt sich das IMHO auch gar nicht abbilden.
 
schmadde schrieb:
denn ausnahmslos alle "Lösungen", die hier gepostet wurden sind keine Regular Expressions, sondern basieren auf irgendwelchen Erweiterungen,
Das liegt daran, dass es keine Verallgemeinerung für reguläre Ausdrücke gibt, sondern diese immer auf einem Dialekt beruhen. Aber meiner ist schon recht allgemein ...
 
Zurück
Oben