Laden...

RegEx: Abfrage von beliebigen Zeichen inklusive Whitespace-Zeichen

Erstellt von Fabian vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.442 Views
Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 16 Jahren
RegEx: Abfrage von beliebigen Zeichen inklusive Whitespace-Zeichen

Hallo zusammen,

ich habe da ein Problem mit folgendem RegEx:

^EXPORT:(?<ExportFile>.+\..{3,4})(,(?<Append>true|false))?\s+(?<ExportStatement>.+)

Dieser RegEx soll folgende Zeilen parsen und in den verschiedenen Gruppen zur Verfügung stellen:

EXPORT:Testdatei.csv,false
SELECT Spalte1, Spalte2 FROM Testtabelle WHERE Spalte3 = 'Testwert'

Das klappt auch ohne Probleme, so lange in dem SQL-Statement kein Zeilenumbruch drin ist, was natürlich öfters vorkommen kann. Das Problem ist das ".+". Ich hatte übersehen, dass mit dem "." alle Zeichen gemeint sind, außer den Whitespace-Zeichen. Wie kann ich die jetzt noch mit in die Abfrage bekommen? Sollte bzw. muss ich das ".+" vielleicht komplett ersetzen? Eigentlich sollte diese Änderung nicht so dramatisch sein, trotzdem stehe ich gerade auf dem Schlauch 😦.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Fabian,

RegexOptions.Singleline

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 16 Jahren

Hallo herbivore,

danke für den Hinweis. Damit löse ich das Problem mit den Zeilenumbrüchen, habe mir aber anscheinend ein neues geschaffen. Folgende Angaben werden nicht richtig geparsed:

EXPORT:FalscheZahlungsüberträge.csv
select Akte.Az,Akte.Unterakte,Vorgang.Datum,Vorgang.Kurztext, Akte.AZ + ' ' + Akte.Unterakte as Fabian

from Vorgang join Akte on Akte.Akte_ID = Vorgang.Akte_ID where Vorgang.Variante = 'U'




and not exists(select 1 from VgBeziehung where VgBeziehung.VonVg_ID = Vorgang.Vg_ID and VgBeziehung.Beziehung = '%VBD%')
order by Akte.Az,Akte.Unterakte,Vorgang.Datum;

Ich habe extra viele Umbrüche etc. pp. eingebaut, um es zu testen. Allerdings macht der Bereich "Akte.AZ + ' ' + Akte.Unterakte" Probleme.

Die Gruppe <ExportStatement> erfasst die folgenden Daten:

'' + Akte.Unterakte as Fabian



from Vorgang join Akte on Akte.Akte_ID = Vorgang.Akte_ID where Vorgang.Variante = 'U'









and not exists(select 1 from VgBeziehung where VgBeziehung.VonVg_ID = Vorgang.Vg_ID and VgBeziehung.Beziehung = '%VBD%')

order by Akte.Az,Akte.Unterakte,Vorgang.Datum;

und das kann ich mir so gar nicht eklären. Die restlichen Daten des Statements werden der Gruppe "ExportFile" zugewiesen. Hast Du eine Idee, was durch die Option Singleline jetzt nicht mehr stimmt?

Die Anweisung für den RegEx sieht momentan so aus:

			RegexCompilationInfo exportRegex = new RegexCompilationInfo(
				@"^EXPORT:(?<ExportFile>.+\..{3,4})(,(?<Append>true|false))?\s+(?<ExportStatement>.+)",
				RegexOptions.Compiled | RegexOptions.Singleline,
				"ExportRegex",
				"IKAROSsqlUpdater.Core.RegEx",
				true);

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Fabian,

hast du schon mit On-the-fly Regex-Tester: Regex-Lab probiert, woran es liegt?

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 16 Jahren

Hallo herbivore,

den hatte ich mir gerade runtegeladen, um mal zu gucken. Ich poste mal den Screeshot an diesen Beitrag. Er hat direkt nach dem ersten "+" ein Problem. Erklären kann ich mir das Verhalten leider noch nicht 😦.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

D
386 Beiträge seit 2007
vor 16 Jahren

Dumm gefragt: In er letzten Gruppe willst du alles ab/inklusive dem Select..?
Wenn ja, dann sieh den Satz als Zaunpfahl.

Pound for pound, plutonium is about as toxic as caffeine when eaten.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Fabian,

naja, aber es ist doch klar: .+ ist gierig. Also geht er solange, bis der die Letzte Möglichkeit findet, die auf ..{3,4}\s passt und das ist eben bei ".AZ + ". Jetzt klarer?

Ich denke, dein Problem lässt sich gar nicht lösen, wenn bzw. solange nicht klar definiert ist, wo das Export-Statement aufhört. Deshalb meine Frage: woran kann man das Ende des Export-Statements erkennen?

herbivore

D
386 Beiträge seit 2007
vor 16 Jahren

Ich denke auch das Format muss besser definiert werden.
Bisher wuerde ich folgendes sehen/vermuten (und liege wahrscheinlich falsch):

Filename und bool sind immer auf einer Zeile, das Statement kommt erst danach.

Wenn das nicht gegeben ist:
Filename und bool werden in dem Ausdruch doch schon gut gematcht. Den Exportausdruck wuerde ich dann am Select oder eben an (select|update|...) verankern.

Im Endeffekt haben wir aber zuwenig Informationen.

Edit: Du kannst natuerlich das (greedy) .+ zu einem .+? zuegeln, um Herbivores Bemerkung zu kommentieren. Aber dein Format ist nach wie vor unvollstaendig erklaert.

Pound for pound, plutonium is about as toxic as caffeine when eaten.

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 16 Jahren

Hallo herbivore,

aber klar doch! Jetzt ist es viel klarer. Auf das ..{3,4}\s bin ich gar nicht gekommen bzw. habe ich gar nicht drauf geachtet.

Ich habe den RegEx jetzt mal folgendermaßen umgebaut:

^EXPORT:(?<ExportFile>.+\..{3,4})(,(?<Append>true|false))?\n(?<ExportStatement>.+)

Jetzt scheint es so zu funktionieren, wie ich das gerne hätte (siehe Screenshot im Anhang).

Bzgl. Deiner Frage, wie man das Ende des Export-Statements erkennen kann: Leider gar nicht! Prinzipiell an einem folgenden //##, was in einer neuen Zeile beginnt. Wirklich sicher kann ich mir da allerdings nicht sein.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 16 Jahren

Hallo DarKlajid,

hast recht, das funktioniert auch (natürlich nur so lange, wie der Dateiname eine korrekte Erweiterung hat. Ansonsten geht er wieder bis zum nächsten Match. Das wäre allerdings dann sowieso ein Fehler).

Nach der Angabe des Dateinamens bzw. der Angabe true|false kann ich mir sicher sein, dass ein Zeilenumbruch erfolgt. Welche Lösung sollte ich dann bevorzugen (\n statt \s+ oder die ungreedy Schreibweise)?

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Fabian,

ok, wenn das eigentliche Export-Statement (select ...) erst nach einem Zeilenvorschub beginnt, dann heißt das ja vermutlich im Umkehrschluss, dass alles andere hinter EXPORT auf einer Zeile stehen muss. Wenn das so ist, dann ist es besser für diesen Teil, [^\n] statt . zu verwenden:

EXPORT:(?<ExportFile>**[\n]+.[^\n]**{3,4})(,(?<Append>true|false))?\n(?<ExportStatement>.+)

Außerdem gibt es im Moment noch Probleme, wenn hinter der true bzw. false noch Leerzeichen oder Tabs o.ä. stehen, bevor der Zeilenvorschub kommt.

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 16 Jahren

Hallo herbivore,

Deine Schlussfolgerung ist korrekt! Danke für die Hinweise mit den [^\n].

Ich habe das Pattern jetzt wieder um das \s+ hinter der true|false-Abfrage erweitert, um auch das Problem mit den Leerzeichen nach dem true bzw. false in den Griff zu bekommen. Jetzt scheint es so, als wenn alles richtig berücksichtigt wird:

^EXPORT:(?<ExportFile>[^\n]+\.[^\n]{2,4})(,(?<Append>true|false))?\s+(?<ExportStatement>.+)

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de