Regex erkennt String nicht



  • @Leon0402 sagte in Regex erkennt String nicht:

    hmm okay, dann vlt. mal anders gefragt. Was wäre denn der richtige Weg? Sollte ich einfach regex_search verwenden oder stattdessen noch ein .* dranhängen?

    Was wäre denn deiner Meinung nach mehr richtig? Suchen oder kompletten Match erzwingen?


  • Mod

    Die Frage ist, was du überhaupt willst. Du schreibst zuerst

    Es sollen alle Strings als inkorrekt angezeigt werden, die Nummern enthalten.

    Aber ist für dich alles, was kein Buchstabe ist, eine Zahl? Falls du wirklich nach Ziffern prüfen möchtest, dann habe ich oben schon eine ganz kurze Lösung vorgeschlagen



  • @SeppJ er wollte wohl auch dass ein '!' gematcht wird.



  • Ich bin davon ausgegangen, dass ich einfach grundsätzlich C++ Regex nicht verstanden habe und habe entsprechend ein minimal not working Example konzipiert, so wie es empfohlen wird 😉

    Mein eigentliches Ziel ist es Einheiten zu erkennen. Also sowas wie "kg" oder auch "ein Teelöffel". Daher, was verhindert werden soll:

    • Leere Eingaben oder nur Leerzeichen
    • Zahlen
    • Irgendwelche Zeichen, die in Wörtern nicht vorkommen wie "?, !, =, )"

    Den regex, den ich dafür in sqlite benutzt habe, war

    "[^a-zA-Z\s]|^\s*$"
    

    Vermutlich habe ich da aber auch noch nicht alles bedacht. Spontan fällt mir auf, dass vermutlich "äöü" nicht zugelassen wird.



  • @Leon0402 wenn du nur Einheiten erkennen willst, warum matchst du nicht einfach nur <Zahl> <Einheit>? Zum Beispiel sowas wie ^(\d+(\.\d*)?)\s*(.+)$.



  • @eigenartig sagte in Regex erkennt String nicht:

    wenn du nur Einheiten erkennen willst, warum matchst du nicht einfach nur <Zahl> <Einheit>?

    Weil ich, wie du selbst nochmal widerholt hast, nur Einheiten matchen will 😉 Keine Zahl davor, nur die Einheit.

    Ich bin kein regex experte, aber für mich sieht es so aus als würde der Ausdruck von dir auch nicht meine (ein Post höher) beschriebenen Anforderungen erfüllen.


  • Mod

    Warum dann nicht direkt so etwas wie kg|mm|mV|…?
    Mit Abwandlungen bezüglich dessen, was davor oder danach kommen kann oder darf, da ich immer noch nicht so ganz sicher bin, was du überhaupt genau möchtest. Hier liegt ein XY-Problem vor. Was ist das, was du am Ende wirklich erreichen möchtest? Beschreib dein eigentliches Vorhaben! Nicht die Schritte, die du denkst, die dazu notwendig sind.



  • @Leon0402 wie @SeppJ bereits erwähnt würde ich versuchen eben die Einheit zu matchen und nicht alles andere als die Einheit.



  • Es geht um Einheiten, die im Bereich Kochen verwendet werden.

    Natürlich habe ich schon darüber nachgedacht, direkt Einheiten zu matchen. Allerdings gibt es sehr viele Einheiten. Von den klassischen Einheiten (g, kg, ml, l ...) zu den "umgangsprachlichen" Einheiten (Teelöffel, Esslöffel, Tasse, Priese, Packung, Stück, Messerspitze, Schuss, .... )

    Vorerst habe ich die Idee erstmal verworfen direkt nur spezifische Einheiten zuzulassen, weil es zu viele gibt und das für mich so nicht praktikabel erscheint.

    Daher die Idee im wesentlichen Freitext zu erlauben, aber eben Fälle auszuschließen, bei denen es sich garantiert um keine Einheiten handelt. Es geht also auch nur um die Eingabe einer Einheit, nix sonst.



  • @SeppJ sagte in Regex erkennt String nicht:

    kg|mm|mV|

    das kann ziemlich lang werden, wenn man von Yokto bis Yotta alle Vorsätze unterstützen will. Andererseits sind bei der Si-Basiseinheit "kg" nicht alle Vorsätze üblich.

    Also vermutlich ist es sinnvoll, per Regex nur generell auf ein paar Buchstaben zu testen, also [a-zA-Z]{1,<maxLänge>}. Wobei - was sind denn lange Einheiten? mmHg vielleicht. Aber was ist mit Einheiten wie km/h oder GeV/c^2? (das c2c^2 ist ja hier praktisch gesehen zur Einheit zugehörig!)



  • @wob Ja genau, das ist der Grund, warum ich das so umgesetzt habe 🙂 Nur das eben noch zusätzlich um Einheiten im Kochen gehen, wo es auch unkonventionelle Einheiten gibt wie "Gehäufter Esslöffel". Da ergibt also eine Beschränkung auf eine Länge auch nur wenig Sinn.


  • Mod

    @wob sagte in Regex erkennt String nicht:

    @SeppJ sagte in Regex erkennt String nicht:

    kg|mm|mV|

    das kann ziemlich lang werden, wenn man von Yokto bis Yotta alle Vorsätze unterstützen will. Andererseits sind bei der Si-Basiseinheit "kg" nicht alle Vorsätze üblich.

    Also vermutlich ist es sinnvoll, per Regex nur generell auf ein paar Buchstaben zu testen, also [a-zA-Z]{1,<maxLänge>}. Wobei - was sind denn lange Einheiten? mmHg vielleicht. Aber was ist mit Einheiten wie km/h oder GeV/c^2? (das c2c^2 ist ja hier praktisch gesehen zur Einheit zugehörig!)

    Ich würde es natürlich nicht explizit ausschreiben, sondern Einheiten können registriert werden, und der Ausdruck wird dann autogeneriert. Es ging erst einmal grundsätzlich um die Fragestellung, warum der Threadersteller nicht direkt nach dem sucht, was er finden möchte.



  • @SeppJ sagte in Regex erkennt String nicht:

    Es ging erst einmal grundsätzlich um die Fragestellung, warum der Threadersteller nicht direkt nach dem sucht, was er finden möchte.

    Wenn ich auf drei Seiten hier meine Problemstellung genau hinschreibe, dann kommt als erstes wieder der Link zu "Wie schreibe ich eine Frage". Schreibe ich meine Problemstellung nur komprimiert hin, dann kommen nur halb durchdachte Antworten (was klar ist und verständlich, weil ihr kennt ja nicht meine genauen Anforderungen).

    Zusätzlich wird alles hier halt auch schnell Off topic. Das fällt mir auch schwer - Ich freue mich ja über innovative Vorschläge (Habe ja auch nicht die Weisheit mit Löffeln gefressen), auf der anderen Seite will ich auch mein konkretes Problem zeitnah lösen und nicht erstmal meinen ganzen Lösungsweg wochenlang diskutieren und in Frage gestellt bekommen.



  • @Leon0402 sagte in Regex erkennt String nicht:

    Es geht um Einheiten, die im Bereich Kochen verwendet werden.

    Das müsste klappen dann musst du nicht jede einzelne Möglichkeit aufschreiben.

    ([\w\-]+)(\s+[\w\-]+)*

    Erwartet ein bis mehrere Wörter das - enthalten darf, die Wörter getrennt von jeweils mindestens einem Space. Das Ding kannst du auch leicht erweitern.

    Matcht Ess-Loeffel Oel



  • @eigenartig sagte in Regex erkennt String nicht:

    ([\w-]+)(\s+[\w-]+)*

    Der Grund warum ich das andersrum aufgezogen habe, war, dass ich nicht mit Regex angefangen habe. Ursprünglich wollte ich es für die Datenbank machen und meine erste Idee war mit "like" -> https://stackoverflow.com/questions/4913964/wildcard-characters-sql-only-alphabet-characters

    Ich denke, da musste man das wohl so machen, weil es einfach nicht so mächtig wie regex ist?

    Stimme dir natürlich zu, dass es besser ist, dass Wort direkt zu matchen. Mit Ausnahem von "ä, ö, ü" scheint das zu klappen, vielen Dank!

    Bezüglich den Sonderzeichen von gewissen Sprachen wie "ä, ü, ö", gibt es da einen Weg in Regex das ohne explizites auflisten zu lösen? Weil andere Sprachen haben ja wieder andere "Sonderzeichen", die in normalen Wörtern vorkommen könnnen.


  • Mod

    Wenn deine Implementierung character classes unterstützt, was die meisten tun, dann sollte die Klasse :alpha: auch Umlaute und ähnliches matchen, die von der aktuellen Locale als solches definiert werden. Das ist dann entweder die aktuelle globale Locale (für neue Regexobjekte), oder man kann einer Regex mit imbue eine Locale zuweisen (aber man muss dann danach einen neuen Ausdruck zuweisen!).

    Ob das funktioniert? Theoretisch ja, aber ich habe das noch nie probiert und habe gerade keine Zeit für große praktische Experimente. Locales sind notorisch fummelig und verlangen viel Spezialwissen, das man nirgendwo sonst benötigt. Ich weiß auch spontan keine Standardlocale, die dir "alle latein-basierten Buchstaben" definiert, aber das kann auch meine Unkenntnis sein. Zur Not kann man sich selber Locales definieren. Womit wir wieder bei der Fummeligkeit und dem arkanen Spezialwissen sind, wenn es darum geht, Locales selber zu definieren.

    Aber wenn du Glück hast, macht es direkt was du möchtest, und der zweite Absatz trifft nicht zu. Daher sind ein paar Versuche sicher nicht schädlich.



  • @Leon0402 sagte in Regex erkennt String nicht:

    Der Grund warum ich das andersrum aufgezogen habe, war, dass ich nicht mit Regex angefangen habe. Ursprünglich wollte ich es für die Datenbank machen und meine erste Idee war mit "like" -> https://stackoverflow.com/questions/4913964/wildcard-characters-sql-only-alphabet-characters

    Was für ein SQL verwendest du denn? MySQL hat jedenfalls einen REGEXP Operator.
    https://dev.mysql.com/doc/refman/8.0/en/regexp.html



  • Sqllite. Es gibt dort zwar den REGEXP Operator, allerdings muss man ihn selbst implementieren. Muss ich mal gucken.

    Ansonsten gibt es nur noch den GLOB ... nicht sicher, ob es damit realisierbar wäre



  • @Leon0402 am Besten implementierst du den dann wenn dem so ist. Ansonsten würde ich auch eher die Shell deines Betriebssystems nehmen, weil das damit viel schneller geht und du nicht an solchen Dependencies gebunden bist, die C++ so hergibt, wenn du was auf nem anderen Rechner installieren willst. Also in diesem Fall grep für die Bourne Shell oder Get-Content in der Powershell.


Anmelden zum Antworten