Moin Christoph
meine frage ist: geht das nicht genereller und wenn ja, wie?
So wie Du das Problem schilderst ist es doch sehr speziell.
Das würde ich auf zwei Bedingungen verteilen, dann kann man das leichter nachvollziehen.
Z.B. so
$match = (preg_match('/\s+([A-Z]{3})\s+/', $s) &&
!preg_match('/\s+(I{3})\s+/', $s));
Bzw. wenn es tatsächlich nur um " III " geht kann man das vermutlich auch einfacher haben. Z.B. mit strstr().
gefundene lösung: alle 3 möglichkeiten durchgehen und jeweils das i ausschließen
/\s(([A-Z]{2}[A-HJ-Z])|([A-Z][A-HJ-Z][A-Z])|([A-HJ-Z][A-Z]{2}))\s/
ist doch ganz gut so.
Ggf. die Reihenfolge so abändern dass der häufigste Fall zuerst steht.
So ungefähr
/\s(([A-HJ-Z][A-Z]{2})|(I[A-HJ-Z][A-Z])|(II[A-HJ-Z]))\s/
lässt sich das auch eleganter machen? ich stelle mir etwas in der richtung vor, das äußerste pattern (\1) irgendwie mit einer bedingung zu belegen...
geht das? wenn ja, wie?
Nein, so wie ich Deine Aufgabestellung verstehe geht es nicht.
Wozu soll das ganze denn gut sein, erscheint mir in der jetzigen Form
sehr konstruiert.
Vielleicht gibt es auch eine Lösung ganz ohne RegExp z.B. mit
count_chars().
Viele Grüße
lulu
bythewaythewebsuxgoofflineandenjoytheday