Entwickler-Ecke

C# - Die Sprache - Regex für Semikolon die NICHT innerhalb von " " oder ' 'sind


Leprechaun - Do 15.05.08 09:22
Titel: Regex für Semikolon die NICHT innerhalb von " " oder ' 'sind
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 - 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 - 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 - 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 - 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 - 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 - Fr 16.05.08 08:08

Hallo,

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


Leprechaun - 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 - 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 - 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:

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:

Quelltext
1:
hhdgh\" " dsjfksdg;JLKf" ; ';"'                    


Leprechaun - 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 - 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.