SELECT mit REGEXP eingrenzen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • SELECT mit REGEXP eingrenzen

      Hi,
      ich benötige Hilfe beim folgendes Problem (sehe wahrscheinlich den Wald vor Lauter Bäumen nicht):

      ich versuche mit folgenden Query den Datensatz einzugrenzen:

      SQL-Abfrage

      1. SELECT * FROM table WHERE text REXEXP '(test 1)'


      Ich suche alle Einträge mit 'test 1' aber keinen mit 'test 11' oder 'test 121'. Es darf aber 'abc test 1' bzw. 'test 1 xxx' bzw. 'abc test 1 abc' gefunden werden. Genauer gesagt die Zahl nach Test muß genau gefunden werden, was vor oder dannach steht ist egal.

      Ich habe schon mehrere Sachen versucht, z.B. funzt auch nicht:

      SQL-Abfrage

      1. SELECT * FROM table WHERE text REGEXP '(test )[1]{0,1}'


      Hat jemand eine Idee ? Danke ...
      Si tacuisses, philosophus mansisses !
    • Hey zerm,


      danke für deine schnelle Antwort ...

      leider bekommen ich immer noch Ergebnisse wie folgt:

      abc test 13
      test 1
      test 11
      test 12


      rot = nicht erwünscht
      grün = erwünscht


      Vieleicht etwas zur SQL Datenbank. mySQL 5.0 auf OS 10.6.6, Teste die Queries mit Sequel pro. Laut Beschreibung wird REXEXP unterstützt.
      Si tacuisses, philosophus mansisses !
    • Du kannst in einer negativen Character Class keine Aggregations benutzen, [^\d] ist zum Scheitern verurteilt. Ich meine -- aus dem Gedächtnis, hab das RegExp-Buch gerade verliehen -- \b sei Word-Boundary, das ist nen Versuch wert. Sonst \D, das wäre "alles außer Ziffer".

      Edit. Du hast natürlich ein Problem, wenn der String da aufhört. Sei doch mal präzise -- bietet sich bei RegExp eh an -- was danach kommen kann bzw darf. Was nicht kommen darf wissen wir jetzt ja.
      if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
    • Hey seb2,
      du hast recht, wenn nach dem gesuchten noch was anderes kommt, schlägt es fehl ! Ich stelle mal eine Liste mit den Möglichkeiten zusammen:
      Suchstring: test 1

      abc test 13 xyz
      abc test 1 xyz
      test 1
      abc test 1
      test 11
      test 12
      abc test 12
      abc test 12 xyz
      test1

      rot = nicht erwünscht
      grün = erwünscht



      abc bzw. xyz dürfen für beliebige Zeichen alphanumerisch und whitespaces stehen !
      Si tacuisses, philosophus mansisses !
    • 'test 1[^\d]*$'
      funktioniert bei mir (mit Python) für alles Testfälle. Das Problem an 'test 1[^\d]*' ist, dass 'test 12' auch matchen muss, da ja nach der 1 eben genau 0-mal (wegen *) eine nicht-ziffer (^\d) kommt, und dannach hört ja die RE auf und es darf sonst etwas kommen.
      Mit obiger RE darf dann nach 'test 1' alles, bloss keine Ziffer kommen, deshalb matched
      'abc test 1 efg 2' auch nicht, was Du aber wahrscheinlich auch willst.
      Damit dass auch noch klappt, tut's bei mir folgende RE
      test 1([^\d]+|$)
      also: Nach der 1 entweder keine Ziffer oder Feierabend ;)
      C++
    • Ich würd ja sagen 'test 1(\D.*)?$'

      @zerm
      Mag sein daß das in Python geht, aber Python will ich gar nicht können. :)
      Als ich das mal gelernt habe -- und da mäanderten noch Dinosaurier über die Erde -- war das nicht zulässig.
      if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
    • seb2 schrieb:

      Du kannst in einer negativen Character Class keine Aggregations benutzen, [^\d] ist zum Scheitern verurteilt. Ich meine -- aus dem Gedächtnis, hab das RegExp-Buch gerade verliehen -- \b sei Word-Boundary, das ist nen Versuch wert. Sonst \D, das wäre "alles außer Ziffer".

      Edit. Du hast natürlich ein Problem, wenn der String da aufhört. Sei doch mal präzise -- bietet sich bei RegExp eh an -- was danach kommen kann bzw darf. Was nicht kommen darf wissen wir jetzt ja.
      Kommt ja immer drauf an, von welchen RegExps wir reden. Bei PCRE ist [^\d] tatsächlich äquivalent zu [^0-9]. Auf MySQL bezogen stimmt Deine Aussage aber, da MySQL generell mit \d nichts anfangen kann, wie etwa SELECT '5' REGEXP '\d' zeigt (vgl. dev.mysql.com/doc/refman/5.5/en/regexp.html).

      Carsten
    • Hallo Nasir, hallo zerm,

      ich habe mal Eure Aussagen zusammengefasst :

      SQL-Abfrage

      1. REGEXP 'test 1([^0-9].*)?$'



      Damit bekomme ich das gewünschte Ergebnis. Ich denke das mySQL, wie gesagt nicht bei den Ausdrücken 100% kompatible ist bzw. nicht alles unterstützt wird.

      Sieht aber schon besser aus, meine Suche !
      Si tacuisses, philosophus mansisses !