[RegEx] Hilferuf eines RegEx-Desperados

ManicMarble

Erfahrenes Mitglied
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:
(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:
\( *[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
 
Zuletzt bearbeitet:
Es könnte
Code:
\( *[^(not)][a-zA-Z0-9äöüßÄÖÜ]+
lauten, bin mir aber nicht sicher.
 
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
 
Ich hab zwar keine Lösung, aber eine Erklärung für den Vorschlag von jockey2:

Code:
[^(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:
\( *([^n])|(n[^o])|([no[^t])[a-zA-Z0-9äöüßÄÖÜ]+
 
Zuletzt bearbeitet:
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... :(
 
(\s*([a-zA-Z0-9äöüÄÖÜ]+)\s*[^(]

Was allerdings bedeutet, dass nach dem not immer eine öffnende Klammer kommt und nach einem Feldnamen nie eine .
 
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. ;-)
 

Neue Beiträge

Zurück