amolip: Regulärer Ausdruck, Hilfe gesucht

Beitrag lesen

Hallo hawk!

Beachte: Das Gradzeichen »°« steht symbolisch für das  Leerzeichen

Syntax mit [^°]* bedeutet doch eigentlich "Kein oder mehrere Leerzeichen" oder?

Nein! Falsch!

Es bedeutet "Kein oder mehrere Zeichen" der zugrundliegenden Zeichenmenge.

Etwas genauer ausgedrückt, könnte man sagen, der Quantifizierer »*« verlangt Null bis - da er gierig ist - möglichst viele Zeichen, der zugrunde liegenden Zeichenmenge.

Die zugrunde liegende Zeichenmenge wird durch die Zeichenklasse definiert. Eine Zeichenklasse kann positiv oder negativ beschrieben werden, positiv bedeutet, man beschreibt welche Zeichen zulässig sind, negativ bedeutet, man beschreibt, welche Zeichen nicht zulässig sind, alle anderen Zeichen sind damit automatisch zulässig.

Die negative Zeichenklasse »[^°]« definiert nun eine Zeichenmenge, die ALLE Zeichen AUßER dem Leerzeichen umfasst. Der gierige Quantifizierer »*« sorgt dafür, dass so lange gefressen wird, bis ein Zeichen auftaucht, das nicht Bestandteil der definierten Zeichenmenge ist. Und das ist in diesem Falle nur ein einziges Zeichen, das Leerzeichen. In dieser Konstellation wirkt es quasi wie ein Stoppzeichen.

Ich dachte allerdings zuerst ich müsste es so schreiben:

if (preg_match_all("#\OpenUI[^ ]*\".$element......
also ohne zusätzlicher Leerstelle
\OpenUI[^ ]*\
anstatt richtig:
\OpenUI[^ ]*°\

Das Leerzeichen ist NICHT Bestandteil der zugrundeliegenden Zeichenmenge, das Leerzeichen selber wird daher nicht gefressen, da es ja kein "gültiges" Zeichen ist. Das Leerzeichen sorgt dafür, dass das Musterelement »[^°]*« aufhört zu fressen, wird aber - wie bereits gesagt, von diesem Musterelement selber nicht gefressen. Das nächste Musterelement, hier also »°«, das dann an der Reihe ist, muss daher dieses Leerzeichen fressen, sonst würde es nicht weiter gehen. Beide Musterelemente zusammen sehen also so aus: »[^°]*°«.

Und bei dem CloseUI war ich mir ganz unsicher denn zwischen CloseUI und dem Doppelpunkt : kommen doch eigentlich nie Leerzeichen vor sondern andere Zeichen.

Der Doppelpunkt »:« ist ein gültiges Zeichen der Zeichenklasse »[^°]« und wird (wie jedes andere Zeichen, außer dem Leerzeichen), sofern er vor einem Leerzeichen auftaucht, gefressen. In deinen nachfolgenden Musterelementen musst du ihn also nicht mehr berücksichtigen, denn er wurde von »[^°]*« bereits gefressen.

Gruß Uwe