Versionen dieses Beitrags

Nochmal Regex gesucht

Thepoeppel crop Rolf B
  • Nochmal Regex gesucht
  • Hallo Pit,
  • > Diese Stelle habe ich aber bereits ermittelt.
  • Ok, dafür kannst Du den offset-Parameter von preg_match verwenden, dann fängt er erst da an zu suchen. Das hättest Du aber bei deinen Beispielen dazu schreiben müssen.
  • > Alles was dann noch durch Leerzeichen getrennt links vor dem ABC-/XYZ-Wort steht brauche ich genau bis zum letzten Vorkommen plus Stringlänge eines Ausdrucks, der mit AB anfängt und dann ein weiteres Zeichen (Buchstabe oder Ziffer) hat und anschließend eine oder beliebig viele Ziffern bis zu einem Leerzeichen enthält.
  • Rhabarber Rhabarber Rhabarber? WAS BRAUCHST DU? Ab wo bis wo? Es passt WIEDER nicht zu dein Beispielen. Oder ich bin doof.
  • *$brain->reset()*
  • Nehmen wir nochmal das Beispiel 3 her:
  • ~~~
  • AB0007711 CD0TZUUZ AB899979 At vero eos et 10 100 XYZ 1.223,50
  • 0....:....1....:....2....:....3
  • ~~~
  • Die 3 "Worte" zu Beginn hast Du bereits ermittelt. D.h. du weißt, dass der Text, der dich interessiert, ab Position 28 beginnt.
  • > Alles was ... inks vor dem ABC-/XYZ-Wort steht brauche ich bis zum (unverständliches Kauderwelsch)
  • > Alles was ... links vor dem ABC-/XYZ-Wort steht brauche ich bis zum (unverständliches Kauderwelsch)
  • Ich unterstelle mal, dass das Kauderwelsch nichts anderes ist als "ich will das, was (im Beispiel 3) vor Position 28 steht, nicht mehr haben". Ok. Dafür gibt's den offset-Parameter von preg_match.
  • Ich unterstelle mal, dass das Kauderwelsch nichts anderes ist als "ich will das, was (im Beispiel 3) vor Position 28 steht, nicht mehr haben". Ok. Dafür gibt's den offset-Parameter von preg_match. Und Du willst nicht "alles links vom ABC Wort", sondern alles außer der Zahl, die links vom ABC-Wort steht, oder? Die Zahl hattest Du ja schon separat beschrieben. Demnach müsste es so passen:
  • ~~~php
  • $pattern = "/(?<vorwort>.*)\s+(?<zahl>[0-9]+)\s+(?<wort>[A-Z]+)\s+(?<betrag>[0-9.,]+)\s*$/";
  • if (preg_match($pattern, $line, $matches, 0, $offset) == 1) {
  • echo "Text zu Beginn : $matches[vorwort]<br>";
  • echo "Zahl vor Suchwort: $matches[zahl]<br>";
  • echo "Gesuchtes Wort : $matches[wort]<br>";
  • echo "Betrag : $matches[betrag]<br>";
  • }
  • ~~~
  • Das Pattern verwendet benannte Gruppen `(?<name>...)`, damit Du die gefundenen Fragmente im $matches-Array leicht finden kannst. Ich bin ziemlich grob beim Matchen des Betrags, aber ich denke, du hast plausible Daten und brauchst keine exakte Kontrolle auf Richtigkeit.
  • Elemente des Patterns sind:
  • `(?<vorwort>.*)\s+` Beliebige Zeichen, und am Ende 1-n Leerstellen
  • `(?<zahl>[0-9]+)\s+` eine Zahl aus 1-n Ziffern 0-9, dann 1-n Leerstellen
  • `(?<wort>[A-Z]+)` Dein gesuchtes Wort, aus Buchstaben A-Z. Keine Kleinbuchstaben, keine Umlaute, wenn das nicht passt musst Du hier nachbessern. Ob Du da in die Verlegenheit kommst, wilde Akzentzeichen oder Zeichen aus nicht-deutschen Sprachen zu finden, weiß ich nicht. Das weißt Du.
  • `(?<betrag>[0-9.,]+)` Der Betrag, als Zeichenkette aus Ziffern, Punkt und Komma. Wie gesagt, das ist ein grober Match. Er matcht auch Beträge die falsches Format haben. Solange deine Daten nur valide Beträge enthalten, reicht das.
  • `\s$` Zum Schluss noch verirrte Leerstellen überspringen und das Zeilenende matchen. Dadurch wird der gewünschte "von hinten" Effekt erreicht.
  • _Rolf_
  • --
  • sumpsi - posui - clusi
  • _Rolf_
  • ---
  • sumpsi - posui - clusi

Nochmal Regex gesucht

Thepoeppel crop Rolf B
  • Nochmal Regex gesucht
  • Hallo Pit,
  • > Diese Stelle habe ich aber bereits ermittelt.
  • Ok, dafür kannst Du den offset-Parameter von preg_match verwenden, dann fängt er erst da an zu suchen. Das hättest Du aber bei deinen Beispielen dazu schreiben müssen.
  • > Alles was dann noch durch Leerzeichen getrennt links vor dem ABC-/XYZ-Wort steht brauche ich genau bis zum letzten Vorkommen plus Stringlänge eines Ausdrucks, der mit AB anfängt und dann ein weiteres Zeichen (Buchstabe oder Ziffer) hat und anschließend eine oder beliebig viele Ziffern bis zu einem Leerzeichen enthält.
  • Rhabarber Rhabarber Rhabarber? WAS BRAUCHST DU? Ab wo bis wo? Es passt WIEDER nicht zu dein Beispielen. Oder ich bin doof. Nehmen wir nochmal den hier:
  • Rhabarber Rhabarber Rhabarber? WAS BRAUCHST DU? Ab wo bis wo? Es passt WIEDER nicht zu dein Beispielen. Oder ich bin doof.
  • *$brain->reset()*
  • Nehmen wir nochmal das Beispiel 3 her:
  • ~~~
  • AB0007711 CD0TZUUZ AB899979 At vero eos et 10 100 XYZ 1.223,50
  • 0....:....1....:....2....:....3
  • ~~~
  • Die 3 "Worte" zu Beginn hast Du bereits ermittelt. D.h. du weißt, dass der Text, der dich interessiert, ab Position 28 beginnt.
  • > Alles was ... inks vor dem ABC-/XYZ-Wort steht brauche ich bis zum (unverständliches Kauderwelsch)
  • Ich unterstelle mal, dass das Kauderwelsch nichts anderes ist als "ich will das, was (im Beispiel 3) vor Position 28 steht, nicht mehr haben". Ok. Dafür gibt's denn offset-Parameter von preg_match.
  • Ich unterstelle mal, dass das Kauderwelsch nichts anderes ist als "ich will das, was (im Beispiel 3) vor Position 28 steht, nicht mehr haben". Ok. Dafür gibt's den offset-Parameter von preg_match.
  • ~~~php
  • $pattern = "/(?<vorwort>.*)\s+(?<zahl>[0-9]+)\s+(?<wort>[A-Z]+)\s+(?<betrag>[0-9.,]+)\s*$/";
  • if (preg_match($pattern, $line, $matches, 0, $offset) == 1) {
  • echo "Text zu Beginn : $matches[vorwort]<br>";
  • echo "Zahl vor Suchwort: $matches[zahl]<br>";
  • echo "Gesuchtes Wort : $matches[wort]<br>";
  • echo "Betrag : $matches[betrag]<br>";
  • }
  • ~~~
  • Das Pattern verwendet benannte Gruppen `(?<name>...)`, damit Du die gefundenen Fragmente im $matches-Array leicht finden kannst. Ich bin ziemlich grob beim Matchen des Betrags, aber ich denke, du hast plausible Daten und brauchst keine exakte Kontrolle auf Richtigkeit.
  • Elemente des Patterns sind:
  • `(?<vorwort>.*)\s+` Beliebige Zeichen, und am Ende 1-n Leerstellen
  • `(?<zahl>[0-9]+)\s+` eine Zahl aus 1-n Ziffern 0-9, dann 1-n Leerstellen
  • `(?<wort>[A-Z]+)` Dein gesuchtes Wort, aus Buchstaben A-Z. Keine Kleinbuchstaben, keine Umlaute, wenn das nicht passt musst Du hier nachbessern. Ob Du da in die Verlegenheit kommst, wilde Akzentzeichen oder Zeichen aus nicht-deutschen Sprachen zu finden, weiß ich nicht. Das weißt Du.
  • `(?<betrag>[0-9.,]+)` Der Betrag, als Zeichenkette aus Ziffern, Punkt und Komma. Wie gesagt, das ist ein grober Match. Er matcht auch Beträge die falsches Format haben. Solange deine Daten nur valide Beträge enthalten, reicht das.
  • `\s$` Zum Schluss noch verirrte Leerstellen überspringen und das Zeilenende matchen. Dadurch wird der gewünschte "von hinten" Effekt erreicht.
  • _Rolf_
  • --
  • sumpsi - posui - clusi
  • _Rolf_
  • --
  • sumpsi - posui - clusi