Hallo dedlfix,
wie kommst Du auf MySQL? Das Tag ist "php"…
@@mixmastertobsi,
Assertions sind auf jeden Fall ein wichtiger Ansatz. Der Grund dafür ist, dass sich die Matches überschneiden:
Test h x Rest
1: ---
2: ---
Der Treffer " h " bewirkt, dass das Space zwischen h und x nicht mehr als Treffer für " x " gewertet wird. Du könntest das lösen, indem Du Sequenzen von Einzelzeichen erkennst (mit \s\S(\s\S)*\s - aber Assertions sind eigentlich verständlicher und sollten auch eine schnellere Regex ergeben.
Eine Assertion sorgt dafür, dass die Regex zwar prüft, ob da eine Leerstelle ist, die Leerstelle aber nicht zum Match hinzuzählt. Ein "positive lookahead" für eine Leerstelle würde durch (?=\s)
gebildet.
Die Zeichen ^ und $, mit denen Du Anfang- oder Ende des String matchst, sind unter der Haube ebenfalls solche Assertions.
Die Regex lautet also: /\s\S(?=\s)|^\S\s|\s\S$/
, und du ersetzt einfach alle Treffer durch einen Leerstring. \s steht für ein beliebiges Whitespace-Zeichen, \S für ein beliebiges Nicht-Whitespace-Zeichen.
Danach musst Du ggf. noch einen zweiten Durchlauf machen, in dem Du \s+ durch " " ersetzt, damit mehrfache Leerstellen weg sind. Ich glaube, dass Du diese beiden Aufgaben nicht in eine Regex kombinieren kannst.
Rolf
sumpsi - posui - clusi