ursus contionabundo: Vorhersehbar untauglicher Lösungsversuch

Beitrag lesen

Na, dann wollen wir mal:

data.txt:

AB0006777 Lore Ipsum 25 ABC 3,72
AB09899 AB00067127 At vero, eos et 2 1 XYZ 13,11
AB0007711 CD0TZUUZ AB899979 At vero eos et 10 100 XYZ 1.223,50

Ich will Dir nicht verschweigen, dass da jemand ganz schlecht geplant hat. Derartige divergierende Strings werden "teuer". Damit meine ich nicht nur die Rechenleistung (wegen der zu kombinierenden Patterns), sondern auch wegen der extremen Fehleranfälligkeit!

Das scheinbar positive aber nur für Deine Beispieldaten gültige Ergebnis kann hier auf Grund von zahlreichen Unwägbarkeiten in den Daten nicht garantiert werden. Betrachte den Code also als kaputt und Deine Frage

Kann man das überhaupt über eine einzige Regex ermitteln?

als mit "NEIN" beantwortet. Das Problem muss an anderer Stelle gelöst werden.

test.php:

<?php

$pattern[] = '^[A-Z0-9]{6,10} [A-Z0-9]{6,10} [A-Z0-9]{6,10} (.*) ([0-9]+) ([0-9]+) (.*) ([0-9.,]*)$';
$pattern[] = '^[A-Z0-9]{6,10} [A-Z0-9]{6,10} (.*) ([0-9]+) ([0-9]+) (.*) ([0-9.,]*)$';
$pattern[] = '^[A-Z0-9]{6,10} (.*) ([0-9]+) ([0-9]+) (.*) ([0-9.,]*)$';


$pattern[] = '^[A-Z0-9]{6,10} [A-Z0-9]{6,10} [A-Z0-9]{6,10} (.*) ([0-9]+) (.*) ([0-9.,]*)$';
$pattern[] = '^[A-Z0-9]{6,10} [A-Z0-9]{6,10} (.*) ([0-9]+) (.*) ([0-9.,]*)$';
$pattern[] = '^[A-Z0-9]{6,10} (.*) ([0-9]+) (.*) ([0-9.,]*)$';


$pattern = '/' . implode('|', $pattern ) . '/';

$rows = file('/tmp/data.txt');
foreach ( $rows as $row ) {
	$row = trim( $row );
	
	preg_match( $pattern, $row, $arr );
	
	$arrE=[];
	foreach($arr as $item) {
			if ( $item ) { $arrE[] = $item; }
	}

	if ( 5 == count( $arrE ) )  {
		$arrE[5] = $arrE[4];
		$arrE[4] = $arrE[3];
		$arrE[3] = $arrE[2];
		$arrE[2] = false;
	}
	
	print_r( $arrE );
}

Das klappt aber NUR dann, wenn die CODES genau 1 bis 3 mal vorkommen, stets eine Länge von 6 bis 10 Zeichen der Klasse [0-9A-Z] haben. Und wenn nichts dergleichen in dem gesuchten Text (genauer an dessen Anfang) vorkommt. Auch die Zifferngruppen vor dem gesuchten Text müssen genau 1 oder 2 mal vorkommen und der gesuchte Text darf nicht nur aus Ziffern bestehen oder mit einem Leerzeichen gefolgt von Ziffern " [0-9]+" enden.

Array
(
    [0] => AB0006777 Lore Ipsum 25 ABC 3,72
    [1] => Lore Ipsum
    [2] => 
    [3] => 25
    [4] => ABC
    [5] => 3,72
)
Array
(
    [0] => AB09899 AB00067127 At vero, eos et 2 1 XYZ 13,11
    [1] => At vero, eos et
    [2] => 2
    [3] => 1
    [4] => XYZ
    [5] => 13,11
)
Array
(
    [0] => AB0007711 CD0TZUUZ AB899979 At vero eos et 10 100 XYZ 1.223,50
    [1] => At vero eos et
    [2] => 10
    [3] => 100
    [4] => XYZ
    [5] => 1.223,50
)

0 71

Nochmal Regex gesucht

Pit
  • regex
  1. 0
    ursus contionabundo
    1. 0
      ursus contionabundo
    2. 0
      Pit
      1. 0
        Matthias Apsel
        1. 0
          Pit
          1. 0
            ursus contionabundo
            1. 0
              Pit
              1. 0
                Rolf B
                1. 0
                  Pit
                  1. 0
                    Rolf B
                    1. 0
                      Pit
                  2. 0
                    Rolf B
                    1. 0
                      Pit
                      1. 0
                        Rolf B
                        1. 0
                          Matthias Apsel
                          1. 0
                            Pit
                            1. 0
                              Rolf B
                              1. 0
                                Pit
                                1. 0

                                  So geht es fast...

                                  Pit
                                  1. 0

                                    Diese Zeile krieg ich nicht gematcht

                                    Pit
                                    1. 0
                                      ursus contionabundo
                                      1. 0
                                        Pit
                                        1. 0
                                          Self-Nachtwächter
                                          • programmiertechnik
                                          • programmplanung
                                          • regex
                                          1. 0
                                            Rolf B
                                            1. 0
                                              Pit
                                              1. 0

                                                Lösungsalternative: pdftotext

                                                ursus contionabundo
                                          2. 0
                                            Pit
                                            1. 0

                                              Diese Zeile krieg ich nicht gematcht - weitere Vereinfachung

                                              ursus contionabundo
                                    2. 0
                                      Gunnar Bittersmann
                                      1. 0
                                        Pit
                                        1. 0
                                          Gunnar Bittersmann
                                          1. 0
                                            Pit
                                            1. 0
                                              Rolf B
                                              1. 0
                                                Pit
                                                1. 0
                                                  MudGuard
                                                2. 0
                                                  Pit
                                                  1. 1
                                                    Pit
                        2. 0
                          Pit
                        3. 0
                          Pit
                          1. 0
                            Pit
                            1. 0
                              Rolf B
                              1. 0
                                Pit
                  3. 0

                    Nach Deinen Ergänzungern verbesserte Lösung

                    ursus contionabundo
                    1. 0
                      Pit
                      1. 0
                        ursus contionabundo
                        1. 0
                          Pit
                          1. 0

                            Tips zur Fehlersuche

                            ursus contionabundo
                            • php
                            1. 0
                              Pit
                              1. 0

                                Du bist nicht allein ...

                                ursus contionabundo
                                1. 0
                                  Pit
                  4. 0
                    Gunnar Bittersmann
                    1. 0
                      Pit
                      1. 0
                        Gunnar Bittersmann
              2. 0

                Vorhersehbar untauglicher Lösungsversuch

                ursus contionabundo
              3. 0
                pl
          2. 0
            Matthias Apsel
            1. 0
              Pit
          3. 0
            beatovich
            1. 0
              Pit
      2. 0
        pl
        1. 0
          Pit
          1. 0
            Mitleser
            • meinung
            • regex
          2. 0
            pl
            1. 0
              Rolf B
              1. 0
                pl
                1. 0
                  Rolf B
                  1. 0
                    pl
            2. 0
              Gunnar Bittersmann
      3. 0
        dedlfix
        1. 0
          Pit