Hallo,
[^a-z] matcht einen Character, der kein Kleinbuchstabe ist.
Nach dem C kommt aber kein Kleinbuchstabe, also paßt der reguläre Ausdruck nicht.
Das stimmt doch. Nach dem C darf KEIN Kleinbuchstabe kommen, aber ein Leerzeichen, eine Ziffer usw.
Ja, MudGuard ist etwas durcheinander gekommen bei seiner Erklärung. Was er _eigentlich_ meinte:
1. String: "HC"
2. Regexp: #C[^a-z]#
Matcht nicht. Grund: *NACH* dem C in "HC" kommt kein weiteres Zeichen mehr. Denn [^a-z] heißt eben NICHT "alles außer Kleinbuchstabe" sondern (Unterschied!) "EXAKT EIN ZEICHEN, das kein Kleinbuchstabe ist".
Man müßte (wie bereits mehrfach erwähnt) mit einer negativen Lookahead-Assertion auf den Kleinbuchstaben gucken,
Das muss man allerdings nicht unbedingt, es reicht, wenn man auf das Stringende prüft: #C([^a-z]|\z)# (gut, hier wäre statt \z auch $ möglich, d.h. #C([^a-z]|$)# da ein potentielles Neue-Zeile-Zeichen am Endes des Ausdrucks hier nichts kaputt macht).
Lookahead-Assertions benötigt man hier also nicht.
was aber aus mir nicht erklärlichen Gründen mit preg_match, preg_match_all usw. nicht funktioniert.
Wenn Lookahead-Assertions bei Dir nicht funktionieren, dann machst Du etwas falsch.
Schau Dir zum Beispiel in meinem Autoload-Artikel an, wie ich CamelCase trenne:
$teile = preg_split ('/(?<=.)(?=\p{Lu}\P{Lu})|(?<=\P{Lu})(?=\p{Lu})/U', ...);
Das sind AUSSCHLIESSLICH Lookbehind- und Lookahead-Assertions. Funktioniert prima.
Viele Grüße,
Christian