[quote=topeg,16.09.2006, 06:18]Es geht auch anders:
Hier zwei Möglichkeiten:
#!/usr/bin/perl
use strict;
use warnings;
my $s='123+456++78+90++';
my $z='\+'; # "+" ist ein Suchzeichen in Regulären Ausdrücken und muß mit "\" auskommentiert werden.
my $e;
print "$s\n";
# mit Permatching
($e=$s)=~s/(?<=[^$z])$z(?=[^$z])/q/g;
print "$e\n";
# mit Ersetzung
($e=$s)=~s/([^$z])$z([^$z])/$1q$2/g;
print "$e\n";
[/quote]
Deine Regexen schlagen beide fehl, wenn das zu ersetzende Zeichen am Anfang oder am Ende des Strings auftaucht. Es muss aber bei beiden Varianten nicht viel geändert werden.
Dein Lookbehind "(?<=[^$z])" heißt soviel wie "vor dem Folgenden muss ein Zeichen sein, das kein $z ist". Wenn man stattdessen "(?<!$z)" nimmt, bedeutet das "vor dem Folgenden darf kein $z sein", was auch für den Stringanfang zutrifft und außerdem auch noch klappt, wenn $z eine längere Zeichenkette ist. Analog kann man für das Stringende einen negativen Lookahead nehmen: "(?!$z)".
Für die Ersetzungsvariante müssen einfach die Regeln vorne und hinten noch um Stringanfang bzw. Stringende ergänzt werden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl
use strict;
use warnings;
for my $s (qw/123+456++78+90++ +123++456+78++90+/) {
my $z='\+'; # "+" ist ein Suchzeichen in Regulären Ausdrücken und muß mit "\" auskommentiert werden.
my $e;
# topeg mit Permatching
($e=$s)=~s/(?<=[^$z])$z(?=[^$z])/q/g;
print "topeg mit Prematching:\n$s => $e\n";
# topeg mit Ersetzung
($e=$s)=~s/([^$z])$z([^$z])/$1q$2/g;
print "topeg mit Ersetzung:\n$s => $e\n";
# Dubu mit negativem Lookbehind/-forward
($e=$s)=~s/(?<!$z)$z(?!$z)/q/g;
print "Dubu mit negativem Lookbehind/-forward:\n$s => $e\n";
# Dubu mit erweiterter Ersetzung
($e=$s)=~s/(^|[^$z])$z([^$z]|$)/$1q$2/g;
print "Dubu mit erweiterter Ersetzung:\n$s => $e\n";
print "\n";
}
__END__
topeg mit Prematching:
123+456++78+90++ => 123q456++78q90++
topeg mit Ersetzung:
123+456++78+90++ => 123q456++78q90++
Dubu mit negativem Lookbehind/-forward:
123+456++78+90++ => 123q456++78q90++
Dubu mit erweiterter Ersetzung:
123+456++78+90++ => 123q456++78q90++
topeg mit Prematching:
+123++456+78++90+ => +123++456q78++90+
topeg mit Ersetzung:
+123++456+78++90+ => +123++456q78++90+
Dubu mit negativem Lookbehind/-forward:
+123++456+78++90+ => q123++456q78++90q
Dubu mit erweiterter Ersetzung:
+123++456+78++90+ => q123++456q78++90q