Calocybe: Regulaerer Ausdruck: Dieses Problem ist geloest - doch warum?

Beitrag lesen

Hi!

Regular Expressions haben normalerweise ein recht einnehmendes Wesen. Da die Verarbeitung solcher Audrücke in der Regel dadurch vorgegeben ist, daß der entsprechende String per Backtracking abgesucht wird, kommt unterm Strich dabei heraus, daß das größtmogliche Ergebnis als Treffer zurückgegeben wird ... ????

Anders ausgedrückt: es wird erstmal versucht, soviel wie möglich in das Ergebnis zu bekommen. Für den Teilausdruck [a-z]+://.+ bedeutet das denn also, daß der gesamte String genommen wird. Nun wird versucht, das / unterzubringen. Dabei geht man dann Schritt für Schritt rückwärts, bis das / passend verwendet werden kann. In diesem Falle also das LETZTE /. Ein ? dreht dieses einnehmende Verhalten nun in der Form um, daß versucht wird sowenig wie möglich in das Ergebnis zu übernehmen. Für den Teilausdruck [a-z]+://.+? wird also z.B. http://w als Ergebnis vorgehalten. Das / wird nun von Links nach rechts gesucht.

Ja, so ungefaehr hatte ich mir das gedacht.

Da Du aber eh das letzte / behalten möchtest, kannst Du Dir natürlich auch das einnehmende Verhalten zu Nutze machen, indem Du einfach soviel wie möglich bis zum / einsammeln läßt:
also durch [^/]+ (alles was nicht / ist).

macht alles zusammen sowas wie:
$referrer = 'http://www.domain.com/directory/index.html';
$referrer =~ s/^\w+://[^/]+//;

Da hat der das doch glatt noch optimiert. :-)  \w+ hatte ich uebrigens absichtlich nicht verwendet, da das Protokoll eigentlich nur aus Buchstaben bestehen sollte, aber is ja egal. Das Dach halte ich fuer ueberfluessig (heisst doch Zeilenanfang?), von mir aus, kann vorher auch noch was anderes stehen.

Das g kannst Du Dir sparen, da Du die Ersetzung nur einmal benötigst ...

Na eben, wie bin ich eigentlich da drauf gekommen?

Calocybe