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
)