Autor Beitrag
bergrath
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Di 18.12.07 12:45 
Hi Leute.

Hab da mal ne Frage: Und zwar würde ich gerne wissen wie man einen Regex-Ausdruck sucht der über 2 oder mehr Zeilen geht. Bisher habe ich immer nur Regex-Ausdrücke verwendet, die sich auf eine Zeile beziehen. Nun muss ich Ausdrücke suchen, die über 2 Zeilen gehen.
Ich gebe euch hier mal ein kleines Beispiel, weil ich echt keinen Schimmer habe, wie das zu realisieren ist:

MSDV 011060 CC 01 *** LESS TELEPHONE PREP PACK *** IECAA +SWKV
MSDV 011070 30 01 23D-SWKM-SWKN-SWKO-SWKP-SWKQ-SWKR-SWKS-SWKT-SWKU-SWD6-SWD5-SWD4-SW
MSDV 011070 30 02 D3-SWD2-SWD1-SWCB-SWC9-SWC8-SWC7-SWC6-SWC5=SWKV$

Der fett markierte Teil ist ein zusammenhängender Ausdruck und für diesen Ausdruck möchte ich ein Pattern formulieren, das genau diesen markierten Teil matcht. Die nicht fett markierten Teile sollten nicht berücksichtigt werden.

Für Tipps und Hinweise wäre ich sehr dankbar.

MfG


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mi 19.12.2007 um 14:26
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 19.12.07 09:01 
Hi.

Kann mir jemand erklären wie ich Matches über mehrere Zeilen erhalten kann? Was ist der Unterschied zwischen Singleline und Multiline???
Danke für eure Antworten im Voraus.

MfG
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 19.12.07 10:42 
Hallo!

Ein mehrzeiliger String ist ja auch nur ein String! Was MultiLine und SingleLine sind, steht ja in der Hilfe sehr gut erklärt. Für Dich wäre IMHO SingleLine das richtige, weil Du ja die Zeilen eigentlich wie eine einzige Zeile behandeln willst.

Den Regex würde ich irgendwie so machen (Pseudo-Regex, da nur im Browser geschrieben ;-))
ausblenden Quelltext
1:
MSDV[ ]011070[ ]30[ ]01[ ]([^\n]+)\n MSDV[ ]011070[ ]30[ ]02[ ]([^\n]+)					

Der gesuchte String ist dann Match Nr.1 und Match Nr.2.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 19.12.07 11:16 
Hi Christian.

Erstmal danke für deine Antwort. Das würde in diesem Fall wohl funktionieren, aber der Text, den ich nach diesem Ausdruck durchsuchen will, ist viel länger und die Zahlen vorne, also MSDV 11112222333444 usw., ändern sich. Deswegen würde diese Variante wohl nicht funktionieren. Wobei die Zahle vorne, die nicht berücksichtigt werden sollen immer eine bestimmt Länge haben.

Welche Möglichkeiten gibt es sonst noch um einen Ausdruck zu finden, der über 2 Zeilen geht und dazwischen eine bestimmte Anzahl von Stellen auszulassen???

Ich müsste im Pattern formulieren, dass in der nächsten Zeile gesucht wird, wenn in der Zeile darüber ein Ausdruck mit SWAA - SWBB - SWCC beginnt ohne dass jedoch in der Zeile darüber ein "=" steht.
Das Problem, das dann entsteht ist leider, dass der Beginn der darunter liegenden Zeile sich immer ändert und nur ab einer bestimmten Position weitergelesen werden darf. Lässt sich soetwas mit Regex-Pattern überhaupt formulieren?

Vielen Dank im Voraus für die Tipps und Hinweise.

MfG
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 19.12.07 11:19 
Kannst Du da vielleicht ein paar Beispiel-Stellen posten? Dann guck ich mir das heute nachmittag mal an, jetzt muss ich erstmal weg ;)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 19.12.07 11:43 
Hi.

Danke dir.Ich hab einfach mal die ganze Textdatei angehängt.Keine Angst es ist nicht die ganze Textdatei, sondern nur ungefähr das erste Viertel davon ( Bis zu der Überschrift SFI, die mit Sternchen umrandet ist.
Ich muss da alle Ausdrücke rausfiltern, wie z.B. 23D=SWAA oder SWAA-SWAB = SWAC oder 23D*SWAD = SWAV oder SWAA-SWAB*SWAC = SWAD oder SWAA*SWC8*SWG=SWKL usw.

Das bekomme ich auch alles hin, außer bei solchen Ausdrücken, die über 2 Zeilen gehen. Das sind zwar nicht viele, aber der Vollständigkeit wegen benötige ich die auch. Es ist mir leider momentan ein Rätsel wie ich das realisieren soll.

Vielen Dank für Tipps und Hinweise im Voraus.

MfG
Einloggen, um Attachments anzusehen!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 19.12.07 15:24 
Wenn ich das richtig verstanden habe, könnte das hier helfen:
ausblenden Quelltext
1:
(?<lineNr>MSDV[ ][\d]{6}[ ](?:30|CC)[ ])01[ ](?:([^\=\$\n]+)(?:\n\k<lineNr>02))?([^\$\n]+\$)					


Bei diesem Input:
ausblenden Quelltext
1:
2:
MSDV 011070 30 01 23D-SWKM-SWKN-SWKO-SWKP-SWKQ-SWKR-SWKS-SWKT-SWKU-SWD6-SWD5-SWD4-SW
MSDV 011070 30 02 D3-SWD2-SWD1-SWCB-SWC9-SWC8-SWC7-SWC6-SWC5=SWKV$

Gibt es als Ergebnis:
ausblenden Quelltext
1:
2:
3:
1: [23D-SWKM-SWKN-SWKO-SWKP-SWKQ-SWKR-SWKS-SWKT-SWKU-SWD6-SWD5-SWD4-SW]
2: [ D3-SWD2-SWD1-SWCB-SWC9-SWC8-SWC7-SWC6-SWC5=SWKV$]
lineNr: MSDV 011070 30

Hier musst Du also nur noch Submatch 1 und 2 zusammen kleben.

Einzeiliger Input:
ausblenden Quelltext
1:
MSDV 010550 30 01 SWKH*SWKF=SWKJ$					

Gibt als Ergebnis:
ausblenden Quelltext
1:
2:
3:
1: 
2: [SWKH*SWKF=SWKJ$]
linenr: MSDV 010550 30

Hier also nur Submatch 2 nehmen (1 ist ja leer).

Hilft das schonmal weiter?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 19.12.07 17:33 
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 09.01.08 15:28 
Hi.

Erstmal vielen Dank für die ausführliche Antwort, welche mir leider während meines Urlaubs entfallen ist. Inzwischen hat sich die Ausgangssituation ein wenig geändert.
Ich muss mittlerweile einen Match erhalten für folgenden zweizeiligen Ausdruck:

23D-SWKM-SWKN-SWKO-SWKP-SWKQ-SWKR-SWKS-SWKT-SWKU-SWD6-SWD5-SWD4-SW
D3-SWD2-SWD1-SWCB-SWC9-SWC8-SWC7-SWC6-SWC5=SWKV$

Es steht also nichts mehr vor dem Beginn der zweiten Zeile, so dass die Regex nun anders formuliert werden müsste.

Wie läßt sich das am besten realisieren, dass ein Ausdruck in dieser Art gefunden werden kann. Ich zerbreche mir schon seit 2 Tagen den Kopf darüber, aber ich komme zu keinem Ergebnis.

Vielleicht kann mir jemand von euch einen Hinweis oder Tip geben. Ich wäre dafür sehr dankbar.

MfG
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 09.01.08 15:36 
Mein obiger Ausdruck sollte sich eigentlich ziemlich leicht darauf anpassen lassen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 09.01.08 15:45 
Hi Christian.

Ja, das glaube ich dir, aber wenn ich ehrlich bin, verstehe ich bei deinem Ausdruck fast nur Bahnhof.

Ich bin nicht gerade der Regex-Spezialist. Meine Regexes sehen alle ungefähr so aus.

[2-8][0-9]([ ]*|[A-Z0-9]*)([*][2-8A-Z][0-9A-Z]{3})*[*+-]*([2-8][A-Z0-9]{3})*([+-]*[S][W][A-Z0-9]{2})*[*]*([S][A-Z0-9]{3}[*]*([2-8][0-9][A-Z0-9]))*[=][S][A-Z0-9]{3}([$]?)

Mit dieser Regex finde ich z.B. Ausdrücke in dieser Art:

23D-SWCU-SWCT-SWA5=SWA2
23D-SWJN-SWJO-SWJP-SWJQ-SWJR-SWJS=SWJT

Wie könnte ich diese oben gepostete Regex erweitern, daß auch 2zeilige Matches dabei rauskommen. Danke im Voraus für Tips oder Hinweise.

MfG
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: Mi 09.01.08 16:35 
wie wärs mit an der entsprechenden Stelle ein \n ins regex einbaun?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 09.01.08 21:50 
Hallo, bergrath!

Eigentlich denke ich, dass es Deine Aufgabe ist, Dich so mit den Tipps, die man Dir gibt, zu beschäftigen, dass Du sie nachvollziehen kannst. Und dann sollte es Dir auch möglich sein, den RegEx von oben so anzupassen, dass er auf die neue Aufgabenstellung passt.

Aber okay, hier ein neuer RegEx, der dem obigen doch erstaunlich ähnlich sieht, wenn man nur ein paar Dinge herausstreicht ;-)
ausblenden Quelltext
1:
(?:([^\=\$\n]+)\n)?([^\$\n]+\$?)					


Im Anhang ein Screenshot vom Regulator, der zeigt, dass der RegEx alles matcht, was Du willst :-)
Einloggen, um Attachments anzusehen!
_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Do 10.01.08 11:59 
Hi Christian.

Vielen Dank für deine Antwort und dein Verständnis für meine Unwissenheit :wink:

Ich habe dein Regex-Pattern ausprobiert, aber leider bekomme ich damit den ganzen Text gematcht. Ich hätte aber gerne ein Regex, das nur 2 zeilige Ausdrücke matcht.Für alle anderen Ausdrücke, die ich filtern muss, habe ich die Regexes schon. Mir fehlt nur noch ein Regex für die zweizeiligen Ausdrücke.

Ich musste die Regex aber auch umschreiben, weil der Compiler zuerst meckerte über nicht erkannte Escapesequenzen. Ich habe die Regex nun folgendermaßen abgeändert:


("(?:([^\\=\\$\n]+)\n)?([^\\$\n]+\\$?)")


Wie ich schon erwähnte wird nun aber der ganze Text gematcht. Liegt das daran, daß ich die Escapesequenzen verdoppelt habe ( also aus einem "\" ein "\\" gemacht habe) oder wo liegt der Fehler?

Vielen Dank für Tips und Hinweise im Voraus.

MfG

Moderiert von user profile iconChristian S.: Code-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 10.01.08 13:00 
Hallo!

Es hätte gereicht, ein @ vor den String zu schreiben, damit C# die Escape-Sequenzen ignoriert. Ich würde das dringend empfehlen, weil es viel übersichtlicher ist. Ich bin mir auch nicht sicher, ob Du jetzt überall genug Backslashes eingefügt hast ;-)

Wenn Du nur zweizeilige Ausdrücke matchen willst, darf der erste Teil des RegEx halt nicht optional sein, das sollte schon reichen.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Do 10.01.08 14:25 
hi.

danke für den Hinweis. Ich habe jetzt alles mögliche probiert, aber ich erhalte immer den ganzen Text gematcht.

ausblenden Quelltext
1:
(@"(?:([^\=\$\n]+)\n)([^\$\n]+\$?)")					


Wie du siehst, habe ich die erste Klammer nicht mehr optional gemacht, aber als Match erhalte ich den ganzen Text.Aber immerhin habe ich dank deiner Hilfe schon den Fortschritt gemacht, daß der zweizeilige Match bei den Ergebnissen dabei ist.

Aber wie bekomme ich die anderen Matches weg, so daß nur die 2zeiligen Matches übrig bleiben?

Wäre sehr dankbar für zündende Ideen.

MfG

Moderiert von user profile iconChristian S.: Code-Tags hinzugefügt
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Fr 11.01.08 08:35 
Hi.

Hat denn niemand einen Vorschlag wie man die Regex ändern kann, um nur 2zeilige Ausdrücke zu erhalten???

Viel Änderungen werden wohl nicht benötigt oder sehe ich das falsch???

Der erste Teil der Regex ist jetzt ja nicht mehr optional, aber wieso wird trotzdem alles gefunden. Ich blick nicht durch woran es hängt.

Hat jemand Tips oder Hinweise, die mir weiterhelfen könnten???

Vielen Dank im Voraus.

MfG
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 11.01.08 11:27 
user profile iconbergrath hat folgendes geschrieben:
Viel Änderungen werden wohl nicht benötigt oder sehe ich das falsch???
Wenn Du siehst, dass es nicht viele sind, dann mach es doch selber :evil: Aber das Höchstmaß an Eigeninitiative scheint ja das Entfernen eines einzelnen Fragezeichens aus einem RegEx zu sein.

Wenn Du das Ganze mal im Regulator anguckst, dann wirst Du sehen, dass nicht alles gematcht wird, sondern von den einzeiligen Ausdrücken nur ein Teil bis zu einem bestimmten Zeichen. Und dann ist auch klar, was Du machen musst.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bergrath Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Fr 11.01.08 11:59 
Nein, das ist nicht das Höchstmaß an Eigeninitiative. Ich habe viele andere Varianten probiert, die aber alle nicht funktioniert haben. Ich habe ja auch erwähnt, daß ich die Regexen, die ich habe anders geschrieben habe und deswegen diese Schreibweise nur schwer nachvollziehen kann.

Ich benutze zum Testen für die Regexen den "Regex-Designer". Ist der Regulator besser oder hat der mehr Funktionen? Wenn ja, dann werd ich den mal nutzen zum Testen.

Und ich verstehe nicht wieso ich hier doch recht barsch angegangen werde nur weil ich Fragen stelle, wozu solche Foren ja letztendlich auch gedacht sind. Bin halt noch neu auf diesem Gebiet und werde mir das passende Verhalten im Board schon noch aneignen.

Naja dann bedanke ich mich mal wieder recht herzlich und hoffe auf dein Verständnis für meine Unwissenheit. Es ist immerhin noch kein Meister vom Himmel gefallen.

MfG
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 11.01.08 12:10 
Die Antwort, in der ich die Dir unbekannte Syntax benutzt habe, stammt vom 19.12.2007! Das sollte doch wohl genug Zeit sein, sich mit dieser Syntax zu beschäftigen. Das meine ich mit Eigeninitiative. Es sieht für mich so aus, als würdest Du den Regex nehmen und wenn Du ihn nicht verstehst, versucht nicht, durch eigenständiges Lernen das zu ändern.

Foren sind dazu da, Fragen zu stellen, das ist richtig. Aber es wird auch erwartet, dass Du Dich mit den Antworten beschäftigst und sie nicht einfach ungesehen übernimmst, ohne zu versuchen, sie zu verstehen. Und ich habe von Dir z.B. noch keine Frage gesehen, die darauf hinauslief, "meinen" Regex zu verstehen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".