Spezielle Zeichenkette per Regex finden

Neurodeamon

Erfahrenes Mitglied
Momentan habe ich einen String mit Zahlen und Buchstaben von 1-99 jeweils durch ein Komma getrennt.
z. B.: 9, 11, 1, 99, 0, 40, AF, 29, 20, 49, 33, 29, 77, C0, 91, 37, 58, 92, 57, 17.

Jetzt möchte ich per preg_match_all alle im String befindlichen NUMERISCHEN Teile ausfindig machen. Mit meinem Beispiel also: 9, 11, 1, 99, 0, 40 / 29, 20, 49, 33, 29, 77 und 91, 37, 58, 92, 57, 17.

Ich habe mir Gedanken dazu gemacht und folgenden regulären Ausdruck hinbekommen der nicht so funktioniert, wie ich gerne hätte. Ich habe natürlich schon weitaus komplexere Ausprobiert, aber so bekomme ich schonmal alle Zahlen die ich brauche. Mit meinen anderen Beispielen kam ich nicht mal soweit :) :
[\s0-9]{1,2}\,[\s0-9]{1,2}

Die Ergebnisse sind immer in Zweiergruppen im Array. Da es sich aber um Sechsergruppen handelt ist das natürlich nicht mein Ziel. Der Punkt ist halt folgender. Vor allen Zahlen befindet sich ein Leerzeichen (also \s) und hinter allen Zahlen ist ein , (Komma) - bis auf die letzte Zahl, die kein nachfolgendes Komma hat. Im String kommen auch noch andere Kombinationen vor 30:20:0:99 usw. - ich brauche aber nur die kommaseparierten Zahlen.

Kann mir jemand einen Gedankenanstoss geben? :confused:
Danke!
 
Neurodeamon hat gesagt.:
Jetzt bekomme ich eine Vierer-String, wobei die erste und letze Zahl des Sextetts nicht beachtet wird. :-)
Hm…
PHP:
<?php

$str = '9, 11, 1, 99, 0, 40, AF, 29, 20, 49, 33, 29, 77, C0, 91, 37, 58, 92, 57, 17';
preg_match_all('/(?<=^|(?:,\s))[0-9,\s]+(?=(?:,\s)|$)/', $str, $matches);
print_r($matches);

?>
Ausgabe:
Code:
Array
(
    [0] => Array
        (
            [0] => 9, 11, 1, 99, 0, 40
            [1] => 29, 20, 49, 33, 29, 77
            [2] => 91, 37, 58, 92, 57, 17
        )

)
:confused:
 
EDIT:
Beispielstring
Code:
19.91.36: 9, 13, 99, 12, 59, 23  DD:21:38
Hiermit sollte es funktionieren - tut es aber nicht

EDIT2:
Manchmal sieht man das offensichtlichste nicht ...

Code:
[0-9]{1,2}\,\s[0-9]{1,2}\,\s[0-9]{1,2}\,\s[0-9]{1,2}\,\s[0-9]{1,2}\,\s[0-9]{1,2}
 
Zuletzt bearbeitet:
Wenn mich nicht alles täuscht könnte man das auch wesentlich kürzer fassen ,

PHP:
$pattern = "/([0-9]{1,2})/";

und dann einfach preg_match_all drüber jagen.
 
FipsTheThief hat gesagt.:
Wenn mich nicht alles täuscht könnte man das auch wesentlich kürzer fassen

Sicherlich, aber dann bekomme ich jede Zahl, was nicht das Ziel ist. Ich möchte die kommagetrennten 6er-Reihen haben, nicht jede Zahl.
 
Neurodeamon hat gesagt.:
EDIT:
Beispielstring
Code:
19.91.36: 9, 13, 99, 12, 59, 23  DD:21:38
Hiermit sollte es funktionieren - tut es aber nicht
Ach so. Merke: Immer möglichst viele verschiedene Eingabestrings angeben, wenn es darum geht, einen geeigneten regulären Ausdruck zu finden ;)

EDIT2:
Manchmal sieht man das offensichtlichste nicht ...

Code:
[0-9]{1,2}\,\s[0-9]{1,2}\,\s[0-9]{1,2}\,\s[0-9]{1,2}\,\s[0-9]{1,2}\,\s[0-9]{1,2}
Ach, verstehe, es handelt sich immer um Sechsergruppen. Das war mir bisher auch noch nicht klar.

Dein Ausdruck ließe sich jetzt noch verschönern:
Code:
\d{1,2}(?:,\s\d{1,2}){5}
 
@Matthias: Ah, Du schlingel. Klar, das ist logisch. Du läßt alle Zahlen mit dem Komma davor auflisten (es müssen fünf sein) und dann noch irgend eine numerische Zahl davor um die sechste Zahl zu erwischen.

Welchen Effekt hat eigentlich
Code:
?:,

Als Gelegenheits-Regexer (oder Nur-Wenn-Es-Sich-Nicht-Vermeiden-Läßt Regexer) verstehe ich das nicht ganz. Ich habe nachgeschlagen und »Non-grouping version of regular parentheses« sagt mir nix :)
 
Zurück