ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
1242
1242
EMPFEHLEN
-
06.06.05 15:40 #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:
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.Code :1
(techtext is null) and (not ((insdate <= '1.1.1999') or ( änddate<='1.1.1999'))))
Mein bisher bester Lösungsansatz:
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".Code :1
\( *[a-zA-Z0-9äöüßÄÖÜ]+
Hat irgendwer 'ne Idee?
Viele Grüße,
MartinGeändert von ManicMarble (06.06.05 um 16:00 Uhr)
-
Es könnte
lauten, bin mir aber nicht sicher.Code :1
\( *[^(not)][a-zA-Z0-9äöüßÄÖÜ]+
-
09.06.05 13:19 #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
-
Ich hab zwar keine Lösung, aber eine Erklärung für den Vorschlag von jockey2:
und bedeutet: alle Buchstaben außer n, o und t. Da "techtext" mit t beginnt wird es nicht gefundenCode :1
[^(not)] ist das selbe wie [^not]
//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.
-
10.06.05 16:34 #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...
-
11.06.05 01:07 #6
- 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
-
so!?
TestCode :1
(?<=\()\s*(?!not)[\w\däöüÄÖÜ]+
.
-
11.06.05 09:13 #8
- 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....
-
11.06.05 12:15 #9
- 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.
-
11.06.05 15:36 #10
- 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!
-
Herrgott... dann mach halt noch ein Leerzeichen hinters "not"
Zitat von php-kopfkratzer

TestCode :1
(?<=\()\s*(?!not )[\w\däöüÄÖÜ]+
.
-
12.06.05 14:38 #12
- 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?
-
Code :
1
(?<=\()\s*(?!not[^\w\däöüÄÖÜ])[\w\däöüÄÖÜ]+
-
13.06.05 09:17 #14
- 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:
Das die Ausgabe:Code :1 2 3 4 5 6 7 8
( not ( nott (not (nott (blah ( blah (. ( \
Code :1 2 3 4 5 6 7 8
( not <X>( nott</X> (not <X>(nott</X> <X>(blah</X> <X>( blah</X> (. ( \
-
15.06.05 22:05 #15
- 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
-
Regex für String.split(regex)
Von anti43 im Forum JavaAntworten: 3Letzter Beitrag: 22.11.10, 12:14 -
RegEx Generator, vom String zum RegEx?
Von tequila slammer im Forum .NET CaféAntworten: 11Letzter Beitrag: 15.11.10, 07:58 -
Mittels Regex Gültigkeit einer anderen Regex prüfen
Von blade runner im Forum PHPAntworten: 8Letzter Beitrag: 25.06.10, 12:07 -
REGEX Problem - Regex auf den gesamten String anwenden?
Von angelikamorgan im Forum JavaAntworten: 1Letzter Beitrag: 21.01.08, 16:58 -
Parsing: RegEx mit '&', RegEx-Kenner gefragt
Von Kachelator im Forum PHPAntworten: 8Letzter Beitrag: 21.04.04, 09:16





Zitieren
Login





