Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Problem mit Regulärem Ausdruck (https://boardunity.de/problem-regul-rem-ausdruck-t5268.html)

cmuebro 25.09.2007 12:20

Problem mit Regulärem Ausdruck
 
Hallo zusammen,

ich suche eine Möglichkeit folgende Zeichenkette korrekt mit einem Regulären Ausdruck auszuwerten:

Code:

RFF+123:123:Test?:412:asd'
Zum Auswerten benötige ich alle + und : jedoch nicht die mit einem Fragezeichen davor.

Also müsste ich am Beispiel als Ergebnis bekommen:

Code:

+:::
Der Doppelpunkt mit dem Fragezeichen davor dürfte also nicht in der Ergebnismenge liege.

Habe schon viel ausprobiert, komme aber einfach auf keine funktionierende Lösung.

Vielen Dank
Christoph

LonelyPixel 25.09.2007 15:25

Backwards Assertions könnten dir hier helfen. Suche alle [:+], vor denen kein ? steht.

Kannst du grade mal den RegExp hinschreiben, den du bislang verwendet hast? Ich weiß grade nicht, was du genau vorhast, also was am Ende rausfallen soll. Dann bau ich dir diese Assertion mit ein.

cmuebro 25.09.2007 15:32

Hallo :)

Habe die Frage natürlich noch in andere Foren gepostet und am Anfang auch noch etwas genauer beschrieben. Hier also nochmal den Post in voller Länge...

Ich kniffle gerade an einem Programm, das EDI-FACT Dateien ausliest und in eine Oracledatenbank überträgt. Zum Glück brauche ich mich vorerst nicht mit der Logik der EDI-FACT Dateien (der Hierachie) auseinander zu setzen, da das in der DB gelöst wird.

Der Eintrag ist lang, jedoch will ich die Situation etwas erläutern!

Erst mal eine kleine Erklärung zu EDI-FACT Dateien und der Situation:

EDI-FACT Dateien sind ähnlich aufgebaut, wie etwas zu komplex geratene CSV Dateien...

Es gibt Segmente/Zeilen (getrennt durch '-Zeichen), jedes Segment ist unterteilt in Composites/Informationsabschnitte (getrennt durch +-Zeichen), die wiederum unterteilt sind in Elemente (getrennt durch :-Zeichen)

Am besten ein Beispiel:
Code:

UNA:+.?'
UNB+UNOA:1+5019069000008:ZZ+5420031800018:ZZ+070626:1325+3089++INSDES'
UNH+1+INSDES:D:96A:UN:DELV'
BGM+351::9+27516130+9'
DTM+137:20070626:102'
...

Die erste Zeile legt Meta- bzw Trennzeichen fest - und zwar für Elemente (: ), Composites (+), Dezimalzeichen (.),
Maskierung (?) [entspricht dem Escapezeichen, z.B. in \n] und Segmente bzw. Zeilen (').

Ich muss jetzt also eine Zeile in ihre Bestandteile auflösen...
Als Beispiel:
Code:

UNH+1+INSDES:D:96A:UN:DELV'
wird zu
Code:

Dim arrSegment() = {"UNH", "1", "INSDES", "D", "96A", "UN", "DELV"}
Soweit, so gut...
Für eine Funktion zum Verarbeiten dieser Werte benötige ich jedoch nicht die Inhalte sondern die Trennzeichen(: und +).
Mit dem Regulären Ausdruck
Code:

[+:*]
bekomme ich auch alle Doppelpunkte und Pluszeichen. Jedoch gibt es das böse Maskierungszeichen... D.h. ich benötige alle + und :, jedoch nicht diejenigen die ein Fragezeichen davor haben (?: bzw. ?+).

Als Beispiel habe ich eine Zeile für Freitext (FTX):
Code:

FTX+DEL+1++Delivery?: 28/06/07 @ 0645'
Ich habe inzwischen diverse mir logisch vorkommende Reguläre Ausdrücke ausprobiert, die jedoch alle nicht zum gewünschten Ergebnis geführt haben. Meiner Vermutung nach habe ich einen Denkfehler, da ich bis jetzt nur sehr einfache Ausdrücke benötigt habe und somit auch nicht viel Erfahrung damit habe.

Ansätze waren z.B.
Code:

(^[\?][:|+]|[:+]) ' liefert mir allerdings auch den Doppelpunkt nach dem ?
(^[\?]?[:|+]) ' totaler Unsinn.. und liefert auch überhaupt kein Egebnis
...

Für einen Ansatz oder eine Erklärung wäre ich euch sehr dankbar.

Vielen Dank
Christoph

cmuebro 25.09.2007 15:49

Ich hoffe das erklärt das Problem. Bei Unklarheiten poste ich gerne weitere Informationen.

Es sollte noch erwähnt werden das die Kombination ?: bzw ?+ jederzeit auftauchen kann und nicht mit einem Trennzeichen : oder + verwechselt werden darf.

Christoph

StGaensler 25.09.2007 18:25

Der Ausdruck Backward oder Lookbehind Assertation wurde ja schon genannt. Der Regex lautet dann: (?<!\?)[:+]

LonelyPixel 26.09.2007 00:05

Off-Topic:
Ha, Lookbehind war der korrekte Ausdruck, er fiel mir nicht ein…

cmuebro 27.09.2007 08:49

Wahnsinn, das klappt tatsächlich und ich hab auch noch ne grobe Vorstellung warum es klappt :-)

Spitze... Gut zu Wissen das es sowas gibt, hab schon an mir und RegEx gezweifelt. :D

VIELEN DANK
.
Christoph

StGaensler 27.09.2007 22:35

Regenechsen :: Ideas come true | Reguläre Ausdrücke allg.

Kann ich nur empfehlen :) Und dann zum ausprobieren: The Regex Coach - interactive regular expressions

LonelyPixel 28.09.2007 14:51

Das hier ist auch ganz gut:
myCSharp.de - DIE C#- und .NET Community - | Projekte | On-the-fly Regex-Tester: Regex-Lab
On-the-fly Regex-Tester: Regex-Lab (aus dem myCSharp-Forum)

cmuebro 01.10.2007 15:45

Zitat:

Das hier ist auch ganz gut:
myCSharp.de - DIE C#- und .NET Community - | Projekte | On-the-fly Regex-Tester: Regex-Lab
On-the-fly Regex-Tester: Regex-Lab (aus dem myCSharp-Forum)
Stimmt das Tool ist sehr übersichtlich.

Vielen Dank nochmal :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25