Hallo Lug!
Mit einem regulären Ausdruck komme ich nicht weiter.
preg_replace( '/\X(.*)X/siU', 'blabla\1undso\1weiter', $text);
Es wird also $text nach Strings durchsucht, die jeweils zwischen zwei "X" stehen. Diese Strings inklusive der "X" werden ersetzt durch einen Ausdruck, der den jeweiligen String zweimal enthält.
So weit, so gut. Nur soll jetzt noch aus jedem ABC in dem String ein DEF gemacht werden. Wie geht das?
Thomas
PS: Es gibt übrigens eine Fähre an etwa der Stelle, an die die Brücke soll.
Am Dienstag, 22. Februar 2005 22:22 schrieb Thomas Schmidt:
So weit, so gut. Nur soll jetzt noch aus jedem ABC in dem String ein DEF gemacht werden. Wie geht das?
Das geht über "Captures" oder "Backreferences". Die gibt es auch im Go-Spiel :-) aber eben auch bei regulären Ausdrücken. In den meisten (perl-kombatiblen) Implentierungen umklammerst du einfach nochmal den gesuchten Ausdruck und kannst hinterher darauf zugreifen.
In deinem Beispiel also: (X(.*)X) Abfrage in Perl: $1 Abfrage in Python: m.group(1) bzw. \1 Abfrage in PHP: \1 Abfrage mit Qt: m.cap() bzw. \1
Je nach Interpreter muß der Backslash noch durch sich selbst gequotet werden. Die m.foo()-Methoden sind objektorientierte Zugriffe auf die Captures, bei PHP wird es direkt über die Match-Funktion gemacht, bei Perl zerhaut es dir vorherige Ausdrücke. (Aber auch da gibt's vermutlich einen Trick.)
Josef
preg_replace( '/\X(.*)X/siU', 'blabla\1undso\1weiter', $text);
So weit, so gut. Nur soll jetzt noch aus jedem ABC in dem String ein DEF gemacht werden. Wie geht das?
Sieht mir nach Perl aus, welches ich nicht spreche, aber kannst Du nicht einfach zuerst alle ABC irgendwo zwischen zwei X in DEF ersetzen und in einem 2. Schritt die Stringverdopplung machen?
Ciao, Felix.
PS: Es gibt übrigens eine Fähre an etwa der Stelle, an die die Brücke soll.
Ja, aber nur für Fussgänger und Fahrräder (und das finde ich auch schön so) und mit m.E. schlechter ÖPNV-Anbindung (korrigiert mich, wenn ich da falsch liege).
Am Dienstag, 22. Februar 2005 23:12 schrieb Felix Becker:
Sieht mir nach Perl aus, welches ich nicht spreche, aber kannst Du nicht einfach zuerst alle ABC irgendwo zwischen zwei X in DEF ersetzen und in einem 2. Schritt die Stringverdopplung machen?
Argh. Meine Antwort war voll am Ziel vorbei. Ich bin wohl schon zu lange auf... Ist übrigens PHP.
Ja, aber nur für Fussgänger und Fahrräder (und das finde ich auch schön so) und mit m.E. schlechter ÖPNV-Anbindung (korrigiert mich, wenn ich da falsch liege).
Neueste Erkenntnisse zur Problematik auf kuarepoti-dju.net. Und damit EOD :-)
Josef
Hallo Lug!
Danke für Eure Antworten! Es handelt sich übrigens um PHP.
preg_replace( '/\X(.*)X/siU', 'blabla\1undso\1weiter', $text);
So weit, so gut. Nur soll jetzt noch aus jedem ABC in dem String ein DEF gemacht werden. Wie geht das?
Am Dienstag, 22. Februar 2005 23:12 schrieb Felix Becker:
aber kannst Du nicht einfach zuerst alle ABC irgendwo zwischen zwei X in DEF ersetzen und in einem 2. Schritt die Stringverdopplung machen?
Die Möglichkeit gefällt mir. Bloß: Wie geht das? Alle ABC zwischen X und Y sollen durch DEF ersetzt werden, die anderen nicht.
Jonas Callback wäre mir nicht so recht.
Thomas
Thomas Schmidt schmidt@netaction.de (Mi 23 Feb 2005 09:29:20 GMT):
Hallo Lug!
aber kannst Du nicht einfach zuerst alle ABC irgendwo zwischen zwei X in DEF ersetzen und in einem 2. Schritt die Stringverdopplung machen?
Die Möglichkeit gefällt mir. Bloß: Wie geht das? Alle ABC zwischen X und Y sollen durch DEF ersetzt werden, die anderen nicht.
Perl-Regexp:
s/(?<=X)ABC(?=Y)/DEF/g
(?<=) : zero width look behind (?=) : zero width look forward
Oder habe ich etwas verpaßt?
Heiko
Hallo Lug!
Ich schrieb Heikos lookforward in Jonas preg_replace_callback auf Felix Art vor den bestehenden Ausdruck. Danke Euch dreien!
Thomas
Hallo Lug!
Danke für Eure Antworten! Es handelt sich übrigens um PHP.
preg_replace( '/\X(.*)X/siU', 'blabla\1undso\1weiter', $text);
So weit, so gut. Nur soll jetzt noch aus jedem ABC in dem String ein DEF gemacht werden. Wie geht das?
Am Dienstag, 22. Februar 2005 23:12 schrieb Felix Becker:
aber kannst Du nicht einfach zuerst alle ABC irgendwo zwischen zwei X in DEF ersetzen und in einem 2. Schritt die Stringverdopplung machen?
Die Möglichkeit gefällt mir. Bloß: Wie geht das? Alle ABC zwischen X und Y sollen durch DEF ersetzt werden, die anderen nicht.
Jonas Callback wäre mir nicht so recht.
Thomas
On Tue, Feb 22, 2005 at 10:22:39PM +0100, Thomas Schmidt wrote:
Hallo Lug!
Mit einem regulären Ausdruck komme ich nicht weiter.
preg_replace( '/\X(.*)X/siU', 'blabla\1undso\1weiter', $text);
Vielleicht nicht im Sinne von regulären Ausdrücken, aber mit PHP kannst du
function my_replace($matches) { $matches[0] = strtr($matches[0], "ABC", "DEF"); // undwasnichalles return $matches[0]; }
preg_replace_callback("/(ABC)/", "my_replace", $text);
machen. See: http://de.php.net/manual/de/function.preg-replace-callback.php
HTH, Jonas
lug-dd@mailman.schlittermann.de