Regular expression

Hallo!

Ich habe z.B. folgendes Script und möchte EINEN Regulären Ausdruck einsetzen, der mir jede einzelne SQL Anweisung findet:


select * from Nasenbaer;

select *
from Nasenbaer
where nase=„rot“ or
fell=";;;schwarz;;;;";

desc nasenbaer;

Ich möchte, dass immer eine GESAMTE Anweisung in einen String kopiert wird. Also suche ich alle Zeichenketten, id mit einem:

;\n

enden. Vorrausetzung jedoch ist, dass kein geöffnetes Hochkomma oder einfaches Hochkomma gesetzt ist - da innerhalb von Texten ein Semikolon mit einem Zeilenumbrauch vorkommen darf. Ich möchte am liebsten den gesammten Text in einer Expression untersuchen können. Leerzeilen sollen nicht beachtet werden.

Es soll dann folgendes herauskommen:

3 einzelne Strings in der Form:

select * from Nasenbaer;

select * from Nasenbaer where nase=„rot“ or fell=";;;schwarz;;;;";

desc nasenbaer;

Ich löse das Problem zur Zeit mit 2 RegExp und einigem Quellcode. Es MUSS aber auch effektiver gehen …

Als Hinweis: Eine nicht geschlossene " oder ’ darf nicht zum Aufhänger werden. (Passierte mir)

Chris


www.schlechte-doku-hasser.de

Hi,

also ich weiss ja nicht, welche Sprache Du benutzt, aber ich habe
mal ein passendes Perl-Skript geschrieben.
Vielleicht hilft Dir das ja etwas.
Die letze Zeile in Input.txt MUSS eine Leerzeile sein, sonst wird
die letzte Anweisung nicht erkannt, weil hinter dem ; dann kein
Zeilenumburch wäre.

#!/bin/perl
open(FILE, ";
close(FILE);

gesamten Inhalt in eine Zeile packen

$inhalt = join(’’, @zeilen);

g - global; ermöglicht Suche in Schleife

s - single line; der gesamte String wird als eine Zeile interpretiert

while ($inhalt =~ /\s*(.+?:wink:\n/sg)
{
my $anweisung = $1;
$anweisung =~ s/\n/ /g; # Zeilenumbruch wird zu blank
print „$anweisung\n=================\n“;
}


Liefert bei mir:

select * from Nasenbaer;

select * from Nasenbaer where nase=„rot“ or fell=";;;schwarz;;;;";

desc nasenbaer;

Ben

also ich weiss ja nicht, welche Sprache Du benutzt, aber ich
habe
mal ein passendes Perl-Skript geschrieben.

Cool Danke. Ich nehm C#. Aber RegEx sollten ja immer gleich sein …

Vielleicht hilft Dir das ja etwas.
Die letze Zeile in Input.txt MUSS eine Leerzeile sein, sonst
wird
die letzte Anweisung nicht erkannt, weil hinter dem ; dann
kein
Zeilenumburch wäre.

Das könnt man ja mit einem ODER noch abfangen … krieg ich schon hin.

g - global; ermöglicht Suche in Schleife

s - single line; der gesamte String wird als eine Zeile

interpretiert
while ($inhalt =~ /\s*(.+?:wink:\n/sg)

Da komm ich nicht mit.
Von wo bis wo geht genau der Ausdruck? Von Tilde bis ) ? Ich versteh den Ausdruck nicht ganz. Beschreibe doch mal mit Worten, was es tun sollte.

{
my $anweisung = $1;
$anweisung =~ s/\n/ /g; # Zeilenumbruch wird zu blank
print „$anweisung\n=================\n“;

Okay. Mal sehn, ob ichs doch noch hinbekomme.

Chris


www.schlechte-doku-hasser.de

Hallo,

while ($inhalt =~ /\s*(.+?:wink:\n/sg)

In $inhalt steht ein langer String, der auch Zeilenumbrüche enthält.
Das =~ kann gelesen werden als ‚soll enthalten‘ oder ‚enthält‘.
Zwischen den beiden äußersten Slashes / steht der reguläre Ausdruck.
\s* - 0…n Whitespaces (Blanks, Zeilenumbrüche, Tabs, …)
.+?; - 1…n beliebige Zeichen, bis das erste ; kommt
Durch die normalen Klammern () wird der ‚konsumierte‘ Teilstring
in der Variablen $1 gespeichert. Sie enthält eine sql-Anweisung.
Nach dem ; muss ein Zeilenumbruch \n kommen.
Der Parameter s unter dem / bedeutet, dass der String in $inhalt als
eine lange Zeile interpretiert wird, dies ist notwendig, weil $inhalt
Zeilenumbrüche enthält.
Der Parameter g ermöglicht die Benutzung des reg. Ausdrucks in einer Schleife. Er bewirkt, dass der String nicht jedesmal wieder von vorne
abgesucht wird, sondern er merkt sich die letzte Fundstelle und sucht
im nächsten Durchgang dort weiter.

Ja, das ist eine grobe Erklärung für den reg. Ausdruck.

Ben