tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
1242
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Mar 2004
    Ort
    Tiefste Provinz
    Beiträge
    304
    Hallo zusammen,
    ich weiß nicht, ob das hier der richtige Platz ist für meine Frage, aber da hier auch der Hinweis auf den RegEx-Coach steht, platziere ich meinen Hilferuf mal hier.

    Bin schwer am kämpfen mit den regulären Ausdrücken und nun letztendlich doch an meine Grenzen gestoßen. Und zwar hiermit:
    Code :
    1
    
    (techtext is null) and (not ((insdate <= '1.1.1999') or (  änddate<='1.1.1999'))))
    Dieses Beispiel ist die Bedingungs-Klausel für eine Abfrage in einer recht exotischen Datenbank. Hier muss ich jetzt alle Feldnamen finden. Feldnamen sind i.d.R. dadurch gekennzeichnet, dass sie immer auf eine öffnende Klammer "(" folgen, wobei da eine beliebige Anzahl Leerzeichen dazwischen stehen kann. Feldnamen bestehen aus alphanumerischen Zeichen oder Umlauten. Das erste nicht-alphanumerische Zeichen kennzeichnet das Ende des Feldnamens.

    Mein bisher bester Lösungsansatz:
    Code :
    1
    
    \( *[a-zA-Z0-9äöüßÄÖÜ]+
    Dieser Ausdruck liefert mir zwar auch immer die öffnende Klammer, das wäre aber nicht so schlimm. Viel schlimmer ist, dass auch das "(not" gefunden wird. Ich müsste die Bedingung also irgendwie erweitern um etwas wie "aber nicht wenn bei der Suche (not rauskommt".

    Hat irgendwer 'ne Idee?

    Viele Grüße,
    Martin
    Geändert von ManicMarble (06.06.05 um 16:00 Uhr)
     

  2. #2
    Avatar von jokey2
    jokey2 jokey2 ist offline Mitglied Smaragd
    Registriert seit
    Nov 2004
    Beiträge
    1.235
    Es könnte
    Code :
    1
    
    \( *[^(not)][a-zA-Z0-9äöüßÄÖÜ]+
    lauten, bin mir aber nicht sicher.
     

  3. #3
    Registriert seit
    Mar 2004
    Ort
    Tiefste Provinz
    Beiträge
    304
    Im Ansatz gute Idee, aber funktioniert leider nur bedingt: Laut RegexCoach wird damit zwar das "(not" nicht mehr gefunden, allerdings wird jetzt das erste Feld (im Beispiel "(techtext") nun auch nicht mehr gefunden (warum das so ist, will mir nicht ganz einleuchten).
    Außerdem werden Felder, die mit "not" beginnen nun ebenfalls ignoriert.

    Ich habe inzwischen eine "ausprogrammierte" Lösung in der "(not" zwar von RegEx gefunden wird, aber im Code dann speziell ausgefiltert wird. Eine echte RegEx-Lösung wäre natürlich erheblich eleganter...

    Dank und Grüße,
    Martin
     

  4. #4
    Frankdfe Frankdfe ist offline Mitglied Gold
    Registriert seit
    Apr 2003
    Beiträge
    151
    Ich hab zwar keine Lösung, aber eine Erklärung für den Vorschlag von jockey2:

    Code :
    1
    
    [^(not)] ist das selbe wie [^not]
    und bedeutet: alle Buchstaben außer n, o und t. Da "techtext" mit t beginnt wird es nicht gefunden

    //Edit: Du konntest folgenden Ausdruck probieren, wobei der nicht sehr elegant ist:

    Code :
    1
    
    \( *([^n])|(n[^o])|([no[^t])[a-zA-Z0-9äöüßÄÖÜ]+
    Geändert von Frankdfe (09.06.05 um 16:36 Uhr)
     
    Der Glückliche phantasiert nie. (Sigmund Freud)
    Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)
    Daraus folgt: Die Genie's sind nicht glücklich.

  5. #5
    Registriert seit
    Mar 2004
    Ort
    Tiefste Provinz
    Beiträge
    304
    Nein. Sorry. So klappt das überhaupt rein gar nicht.
    Findet "( t" und "text" und "nu" und "nd" und "not" und "((" und "ns" und, und, und...
     

  6. #6
    php-kopfkratzer php-kopfkratzer ist offline Mitglied Silber
    Registriert seit
    Apr 2005
    Beiträge
    63
    geht definitiv nicht, leider...
    aber schau dir das mal an:

    http://lists.suse.com/archive/suse-l...-Sep/0470.html
     

  7. #7
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    so!?
    Code :
    1
    
    (?<=\()\s*(?!not)[\w\däöüÄÖÜ]+
    Test



    .
     

  8. #8
    shockshell shockshell ist offline Mitglied Brokat
    Registriert seit
    Jun 2005
    Ort
    Buxtehude (Niedersachsen)
    Beiträge
    256
    (\s*([a-zA-Z0-9äöüÄÖÜ]+)\s*[^(]

    Was allerdings bedeutet, dass nach dem not immer eine öffnende Klammer kommt und nach einem Feldnamen nie eine .
     
    Nichts hält so lange wie ein Provisorium....

  9. #9
    mueslirocker mueslirocker ist offline Mitglied Bronze
    Registriert seit
    Jun 2005
    Beiträge
    48
    Soll denn "( notblabla" wieder einen Treffer darstellen?
    Ich denke mal ja.

    Hm, man könnte doch nen DEA baun und den dann umbaun.
    Ich komm dann auf diese reguläre Sprache (naja, zumindes ähnelt es einer reg. Sprache ).

    S -> "("\s*(([^n]E)|(nX))
    X -> ([^o]E)|(oY)
    Y -> ([^t]E)|(tZ)
    Z -> .E
    E -> .*

    Ich erinnere mich nicht mehr so richtig an den Algorithmus zum Herleiten eines regulären Ausdrucks, aber ich glaub so schwer ist es in dem Fall nicht.

    Ohne Garantie auf Richtigkeit:
    "("\s*(([^n].*)|(n(([^o].*)|(o(([^t].*)|(t.+))))))

    /edit
    Achso... der "." soll alle zulässigen Zeichen darstellen.
    Nach dem was ich grad so lese also . = [a-zA-Z0-9ÄÖÜäöüß] oder so.
     

  10. #10
    php-kopfkratzer php-kopfkratzer ist offline Mitglied Silber
    Registriert seit
    Apr 2005
    Beiträge
    63
    Code :
    1
    
       (?<=\()\s*(?!not)[\w\däöüÄÖÜ]+

    Was ist mit (nott und (notttt (notttt und (nota und (nota23 und und und ?
    geht nicht!
     

  11. #11
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Zitat Zitat von php-kopfkratzer
    Code :
    1
    
       (?<=\()\s*(?!not)[\w\däöüÄÖÜ]+

    Was ist mit (nott und (notttt (notttt und (nota und (nota23 und und und ?
    geht nicht!
    Herrgott... dann mach halt noch ein Leerzeichen hinters "not"

    Code :
    1
    
     (?<=\()\s*(?!not )[\w\däöüÄÖÜ]+
    Test

    .
     

  12. #12
    php-kopfkratzer php-kopfkratzer ist offline Mitglied Silber
    Registriert seit
    Apr 2005
    Beiträge
    63
    ok ok, schon recht gut,
    kannst du mir dann auch sagen, was passiert, wen hinter dem "(not" kein leer folgt, z.b. nach trim() oder so.dann wird laut regexcoach das (not wieder alsTreffer gewertet.
    Vielleicht mit einem "oder" irgendwie?
     

  13. #13
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Code :
    1
    
    (?<=\()\s*(?!not[^\w\däöüÄÖÜ])[\w\däöüÄÖÜ]+
     

  14. #14
    mueslirocker mueslirocker ist offline Mitglied Bronze
    Registriert seit
    Jun 2005
    Beiträge
    48
    Also ich arbeite mit flex, aber so groß sollten die Unterschiede ja nicht sein.
    Hatte noch ein Problem in meinem RegEx.
    Das [^n] beinhaltet auch Freizeichen, was den Ausdruck kaputt macht.

    Da ich die !(blubb) Ausdrücke nicht mag und nicht weiß, ob der letzte gelieferte Ausdruck funktioniert, hier nochmal meine Version, die den Weg zu Fuß geht.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    validchar       ([a-zA-Z0-9äöüÄÖÜß_])
    notN            [a-mo-zA-MO-Z0-9äöüÄÖÜß]
    notO            [a-np-zA-NP-Z0-9äöüÄÖÜß]
    notT            [a-su-zA-SU-Z0-9äöüÄÖÜß]
    whitespace      [ \t]
    blubb           "("{whitespace}*(({notN})|("n"(({notO})|("o"(({notT})|("t"{validchar})))))){validchar}*
    %%
    {blubb}          printf("<X>%s</X>",yytext);
    .                printf("%s",yytext);
    \n               printf("%s",yytext);

    Mit flex funktioniert es bestens.

    Das hier ist die Eingabe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    ( not
     ( nott
       (not
     (nott
    (blah
      ( blah
    (.
     (  \
    Das die Ausgabe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    ( not
     <X>( nott</X>
       (not
     <X>(nott</X>
    <X>(blah</X>
      <X>( blah</X>
    (.
     (  \
     

  15. #15
    php-kopfkratzer php-kopfkratzer ist offline Mitglied Silber
    Registriert seit
    Apr 2005
    Beiträge
    63
    Super!
    Bis auf den kleinen Schönheitsfehler, dass '( not' auch nicht gefunden wird, und das sollte ja prinzipiell nicht sein. Kann man da auch was machen?

    greetz
    php-headscratcher
     

Ähnliche Themen

  1. Regex für String.split(regex)
    Von anti43 im Forum Java
    Antworten: 3
    Letzter Beitrag: 22.11.10, 12:14
  2. RegEx Generator, vom String zum RegEx?
    Von tequila slammer im Forum .NET Café
    Antworten: 11
    Letzter Beitrag: 15.11.10, 07:58
  3. Antworten: 8
    Letzter Beitrag: 25.06.10, 12:07
  4. Antworten: 1
    Letzter Beitrag: 21.01.08, 16:58
  5. Parsing: RegEx mit '&', RegEx-Kenner gefragt
    Von Kachelator im Forum PHP
    Antworten: 8
    Letzter Beitrag: 21.04.04, 09:16