Autor Beitrag
Leprechaun
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 15.05.08 09:22 
Hallo zusammen,

ich versuche schon seit geraumer Zeit eine RegEx zu basteln um herauszufinden ob in einem String (fertiger SQL-String) ein ; ist, das NICHT innerhalb von doppelten oder einfachen Hochkommata steht. Kann man das mit einem RegEx ausdrücken?

Gruß

Leprechaun
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Do 15.05.08 10:19 
Titel: Re: Regex für Semikolon die NICHT innerhalb von " " oder ' '
user profile iconLeprechaun hat folgendes geschrieben:
Kann man das mit einem RegEx ausdrücken?


Ja.
Leprechaun Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 15.05.08 13:16 
Titel: Re: Regex für Semikolon die NICHT innerhalb von " " oder ' '
user profile iconbakachan hat folgendes geschrieben:
user profile iconLeprechaun hat folgendes geschrieben:
Kann man das mit einem RegEx ausdrücken?


Ja.


Supi, könntet Ihr/Du mir dan bitte etwas auf die Sprünge helfen. Ich beiß mir schon seit geraumer Zeit die Zähne daran aus ... leider :(.

Gruß

Leprechaun
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Do 15.05.08 13:17 
Was genau funktioniert bei dir nicht bzw wo genau liegt das Problem?
Was hast du bis jetzt schon?
usw.
Leprechaun Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 15.05.08 16:10 
Ich hab da so ein "Monster" bislang rausbekommen ... aber sobald es mehrere ranges in Hochkommata gibt haut das nicht mehr so ganz hin.

((=\s*?("|').*?("|'))(.*?;.*?)(=\s*?("|'))) | (["|'].*?;[^"|']*?$)
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Fr 16.05.08 07:51 
Sorry aber aus deinem Regex werd ich nicht schlau.
Bevor du den RegEx schreibst solltest du überlegen welche Aufgaben er erfüllen soll:
1. Es soll ein Semikolon finden. -> ;
2. Dieses Semikolon soll nicht von Hochkommata eingeschlossen sein -> LookBehind benötigt
(dieser lookbehind muss festlegen das vorher kein " oder ' stehen außer wenn es durch ein zweites der gleichen Sorte wieder geschlossen wurde -> 3teilig)

Ich hab mir das mal kurz angeguckt
mein Regex dafür ist auch nur 1 Zeichen kürzer als deiner (das meiste ist der Lookbehind)


Ich hoffe das hat dir ein bischen geholfen, falls nicht oder falls du irgendetwas davon nicht verstehst frag nochmal nach.
(Ich gebe nicht gerne einfach komplettlösungen raus :P )
Leprechaun Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 16.05.08 08:08 
Hallo,

könntest Du mir Dein konstrukt bitte mal Posten, danke.
Leprechaun Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 16.05.08 08:49 
user profile iconLeprechaun hat folgendes geschrieben:
Hallo,

könntest Du mir Dein konstrukt bitte mal Posten, danke.



Ach ne ... Lookbehind war das Stichwort das fehlte ... doch noch nicht Posten ... ich versuchs nochmal :) und Melde mich da nochmal obs klappt :)
Leprechaun Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 19.05.08 06:49 
user profile iconbakachan hat folgendes geschrieben:
Sorry aber aus deinem Regex werd ich nicht schlau.
Bevor du den RegEx schreibst solltest du überlegen welche Aufgaben er erfüllen soll:
1. Es soll ein Semikolon finden. -> ;
2. Dieses Semikolon soll nicht von Hochkommata eingeschlossen sein -> LookBehind benötigt
(dieser lookbehind muss festlegen das vorher kein " oder ' stehen außer wenn es durch ein zweites der gleichen Sorte wieder geschlossen wurde -> 3teilig)

Ich hab mir das mal kurz angeguckt
mein Regex dafür ist auch nur 1 Zeichen kürzer als deiner (das meiste ist der Lookbehind)


Ich hoffe das hat dir ein bischen geholfen, falls nicht oder falls du irgendetwas davon nicht verstehst frag nochmal nach.
(Ich gebe nicht gerne einfach komplettlösungen raus :P )



Ok.Das mit dem Lookbehind haut jetzt hin. Ich habe den Ausdruck nun so hinbekommen, dass er alle Teile mit ="..." oder ='...' findet und auch wenn ein ; nicht dort ist wo er sein soll/darf, aber ... wenn an letzter Stelle ein ="..." ist, der string also damit aufhöhrt haut es immer noch nicht hin :(., könntest Du mir da bitte auf die Sprünge helfen?

=\s*?(["|']).*?(?<!\\)\1

Das wäre der Ausdruck um alle vorkommen von ="..." und ='...' (auch wenn gequotete \" oder \' enthalten sind) findet ... es fehlt das Fragment das nun schaut ob bis zum nächsten =" oder Lineend noch ein ; kommt :(
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 19.05.08 09:19 
Mit einem Lookbehind dürfte das nicht funktionieren, man muss schon den gesamten Text matchen. Irgendwie fühle ich mich gerade nicht mehr so regex-firm ;) , aber so ähnlich sollte es funktionieren:
ausblenden Quelltext
1:
^(".*?(?<!\\)"|'.*?(?<!\\)'|\\.|(?<g>;)|[^"'\\])*$					

Alle Semikola außerhalb eines Strings werden in der Gruppe g gecaptured. Keine Ahnung, was SQL an Escaping-Möglichkeiten bietet, also habe ich mal nur \" und \' eingebaut. Teststring:
ausblenden Quelltext
1:
hhdgh\" " dsjfksdg;JLKf" ; ';"'					
Leprechaun Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 19.05.08 10:44 
Das ist ein ganz anderer Ansatz, danke dafür. Zum Verständnis, wofür ist dieses "or" da |\\.| ... also ein \ gefolgt von einem einzelnen Zeichen, aber warum?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 19.05.08 13:06 
Im Grunde sage ich einfach, was ich im Text erwarte: einen "-String, einen '-String, ein Semikolon, ein escaptes Zeichen oder irgendein anderes Zeichen. Ohne den \\. Zweig würde \" als einzelnes Zeichen (Backslash) und als String-Anfang interpretiert.