string mit regex match auslesen

cuban

Grünschnabel
Hallo,

ich habe einen Report, dessen Werte ich in einzelne Variablen einlesen möchte.

DB DE zerobalancing 51 zerobalancing 200787002 31-JUL-07 581,661.24
TRALA-DE-0707018-AP Su TEST POST - 11.07.07 31-JUL-07 (59.50)
ESA-DE-0JUHAP Pa GESTOLPERTE HANDELS - 16.07.07 31-JUL-07 (181.49)

Zwichen "DB DE zerobalancing" und "51 zerobalancing 200787002" sind mehr als drei Leerzeichen

Das Datum und der Betrag ist kein Prolem. Die Herausforderung sind die ersten beiden Strings.
In diesem Fall soll

DB DE zerobalancing

in die Variable


gelesen werden und der String

51 zerobalancing 200787002

in die Variable


Das Problem ist, dass dieser Report werder tab oder pipe delimited ist und ich somit nicht immer jedes Feld in eine Variable lesen kann, sonder auch unerwünscht den wert der ersten beiden Textfelder in eine Variable lese.

Ich dachte ich lese das mit regex match ein, mit einem Pattern, dass sagt, dass der wert der in die Variable gelesen wird zwischen 0 und 3 Leerzeichen enthalten muss. Entweder habe ich das falsch geschrieben oder meine Idee funktioniert nicht.

Es wird immer in die Variable "JournalName" der string "DB DE zerobalancing51 zerobalancing" eingelesen anstatt nur "DB DE zerobalancing".

Dies ist mein code:

Code:
[match (?<JournalName>[\s{0,3}+$ ]


Ich habe es auch so versucht, da habe ich allerdings keinen Werte in die Variable JournalName bekommen.

Code:
match (?<JournalName>((([\w|\d|-]+)\s{0,3})+([\w|\d|-]+)(?:\s{0,3})) ]


Kann mir bitte jemand von euch helfen wie ich das matchen kann?


Vielen Dank im Voraus.
cuban
 
Zuletzt bearbeitet:
Probier mal folgenden Ausdruck:
Code:
/^(?P<JournalName>.*?)\s{2,}(?P<LineDescription>.*?)\s{2,}/m
 
Danke für Eure Hilfestellungen.

Code:
^([a-zA-Z\s]+)
funktioniert leider nicht, da auch Zahlen und Sonderzeichen vorkommen können. (Für die Erste Zeile ohne Nummern hat es in meiner Anwendung funktioniert.)
Z.Bsp.
ESAF-JP-0907002-CD Pa (...mehrere Leerzeichen...) HANSI FRANZL - CORRECTION

Code:
/^(?P<JournalName>.*?)\s{2,}(?P<LineDescription>.*?)\s{2,}/m
hat zwar in einem externen regex Analyzer perfekt funktioniert (Espresso). Allerdings bekommt ich in meiner Anwendung keine Werte übermittelt.

Das ?P und /m hat nicht funktioniert, ist als Fehler aufgekommen.
So habe ich es umgewandelt, dass ich es fehlerfrei einsetzen konnte, doch wie gesagt, liest es keine Werte aus.

Code:
[match (?<JournalName>^.*?\s{2,}) ]           [match (?<LineDescription>.*?\s{2,}) ]


Habt ihr noch eine Weitere Idee, wie ich vorgehen könnte?


Vielen Dank!
Cuban
 
Zuletzt bearbeitet:
Zwichen "DB DE zerobalancing" und "51 zerobalancing 200787002" sind mehr als drei Leerzeichen

Steht das denn wenigstens fest, dass sich dort(und nur dort) mehr als 3 Leerzeichen befinden?
Falls nämlich nicht, wird das so gut wie unmöglich, irgendwas braucht man schon, woran man sich festbeissen kann, und das hat man nicht, wenn überall alles stehen kann(die Flag FX gibts in RegExp leider nicht :-))

Und könntest du mal kurz erläutern, was in den Zeilen
Code:
TRALA-DE-0707018-AP Su TEST POST - 11.07.07 31-JUL-07 (59.50)
ESA-DE-0JUHAP Pa GESTOLPERTE HANDELS - 16.07.07 31-JUL-07 (181.49)
...Journalname und was LineDescription werden soll?


Und noch was: dem, der diesen Report so conventionsfrei mit Buchstabensalat gefüllt hat, hau eine runter :suspekt:
 
Ja, das ist auf jedem Fall so, dazwischen (zwischen "JournalName" und "LineDescription") sind immer mehr als 3 Leerzeichen.

Gruß,
Cuban
 
DB DE zerobalancing (mehr als 3 Leerzeichen) 51 zerobalancing 200787002
ESA-DE-0907002-CD Pa (mehr als 3 Leerzeichen) JANA FRANZ - CORRECTION


DB DE zerobalancing --> JournalName
51 zerobalancing 200787002 --> LineDescription

ESA-DE-0907002-CD Pa --> JournalName
JANA FRANZ - CORRECTION --> LineDescription
 
PHP:
$str = <<<STRING
DB DE zerobalancing                       51 zerobalancing 200787002      31-JUL-07          581,661.24
TRALA-DE-0707018-AP Su                        TEST POST - 11.07.07        31-JUL-07              (59.50)
ESA-DE-0JUHAP Pa                        GESTOLPERTE HANDELS - 16.07.07     31-JUL-07             (181.49)
STRING;
preg_match_all('/^(?P<JournalName>.*?)\s{3,}(?P<LineDescription>.*?)\s{3,}/m', $str, $matches);
var_dump($matches);
 
Ich kann die gesamte Funktion leider nicht so nutzen.
PHP:
$str = <<<STRING
DB DE zerobalancing                       51 zerobalancing 200787002      31-JUL-07          581,661.24
TRALA-DE-0707018-AP Su                        TEST POST - 11.07.07        31-JUL-07              (59.50)
ESA-DE-0JUHAP Pa                        GESTOLPERTE HANDELS - 16.07.07     31-JUL-07             (181.49)
STRING;
preg_match_all('/^(?P<JournalName>.*?)\s{3,}(?P<LineDescription>.*?)\s{3,}/m', $str, $matches);
var_dump($matches);

Die Applikation, mit der ich den Report auslese, hat eine Text Parser Template (in C# programmiert). In diesem Template lese ich den Text aus. Ich kann darin keine neuen Funktionionen eingeben. "Text" = Text, "Text den ich in eine Variable weitergeben möchte" = [Text]. Darin kann ich auch die funktion match nutzen. Der genaue Syntax den ich dafür benutzen muss ist z.Bsp. [match (?<JournalName>^.*?\s{2,}) ]

Die Text Zeile
ESA-DE-0907002-CD Pa FX LOSSAZZURRI COMMUNICATION 30-SEP-07 (136.04)

würde ich ohne Regex so einlesen:

Code:
[JournalName]        [LineDescription]                      [!GlDate]              [$GlAmount]

mit regex

Code:
[match (?<JournalName>^.*?\s{2,}) ]        [match (?<LineDescription>.*?\s{2,}) ]                      [!GlDate]              [$GlAmount]


Kann mir einer von euch beiden hier vielleicht noch mal bitte helfen. Habe nun schon Stunden damit verbracht, den Bericht zu lesen.


Vielen Dank,
Cuban
 
Zurück