Schrift
[thread]12173[/thread]

Regexp: Ersetzungsausdruck mitbenutzen

Leser: 2


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
#Kein Kommentar
 2008-07-12 21:22
#112034 #112034
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
hej hallo,

ich habe eine frage zu regulären ausdrücken in Perl:

ich habe folgenden code:
Code: (dl )
1
2
3
4
5
6
7
8
my $string	= "test test %ae, test %ue test, %oe";

my $find = "%(ae|oe|ue)";
my $replace = '%\1;';

$string =~ s/$find/$replace/g;

print "$string\n";

jetzt möchte ich das der ausdruck in $replace benutzt wird, damit sich das '\1' auf die klammer in $find beziehen kann. wie kann ich das bewerkstelligen?

außer das ich das hier benutze:
Code: (dl )
1
2
3
4
5
6
7
8
my $string	= "test test %ae, test %ue test, %oe";

my $find = "%(ae|oe|ue)";
#my $replace = '%\1;';

$string =~ s/$find/%\1;/g;

print "$string\n";

denn das find- und replacemuster muss der benutzer des programms eingeben.
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
Linuxer
 2008-07-12 21:49
#112035 #112035
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

[s]im Ersetzungsteil solltest Du $1 anstatt \1 benutzen.[/s]
[s]edit: Musst natürlich drauf achten, dass es beim Zusammenbauen von $replace vor Interpolation geschützt ist; also wie bereits von Dir gemacht, einfache Hochkommata oder q~~ verwenden, oder mit 'nem Backslash maskieren.[/s]

[s]$text =~ s/$find/$replace/ge;[/s]
[s]Der Modifier /e sollte das sein, was Du brauchst.[/s]

update: Hm, zu schnell aus der Hüfte geschossen. :o((
Will doch nicht so, wie ich mir das gedacht hatte....

update2:
pq's Gedanke an quotemeta() gewürdigt, kommt meine parallel zu ihr entwickelte lösung auf folgendes:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my $string    = "test test %ae, test %ue test, %oe";

my $find    = "%(ae|oe|ue)";
my $replace    = '#\1;';

# pq's Lorbeeren hinzugefuegt
$replace = quotemeta $replace;
$replace =~ s/\\\\(\d)/\$$1/g;

# meine Beerchen ;)
eval "\$string =~ s/$find/$replace/g;";
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
pq
 2008-07-12 22:17
#112036 #112036
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code (perl): (dl )
1
2
3
$replace = quotemeta $replace;
$replace =~ s/\\\\([1-9][0-9]*)/\$$1/g;
$string    =~ s/$find/qq{"$replace"}/gee;

das sollte gehn, das quotemeta vorher ist zur sicherheit, damit der user
keinen perl-code einschmuggeln kann, denn das /ee nach der regex bedeutet ein string-eval.

edit: [1-9][0-9]* statt \d+, sonst könnte man $0 interpolieren.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
#Kein Kommentar
 2008-07-12 23:13
#112037 #112037
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
vielen, vielen dank! auf das 'e' als modifier war ich auch schon gekommen, aber es doppelt zu benutzen...
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
KurtZ
 2008-07-12 23:30
#112038 #112038
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Linuxer+2008-07-12 19:49:54--
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my $string    = "test test %ae, test %ue test, %oe";

my $find    = "%(ae|oe|ue)";
my $replace    = '#\1;';

# pq's Lorbeeren hinzugefuegt
$replace = quotemeta $replace;
$replace =~ s/\\\\(\d)/\$$1/g;

# meine Beerchen ;)
eval "\$string =~ s/$find/$replace/g;";


sorry ich verstehe hier nur Bahnhof, und RegExes interessieren mich brennend... :-)

bei obigem Code bekomme ich mit
Code (perl): (dl )
1
2
 $,="\n";
print $find,$replace,$string;

%(ae|oe|ue)
\#$1\;
test test #ae;, test #ue; test, #oe;

???

verstehe ich die Fragestellung richtig?
Wie kann man Pattern und Replace als Strings eingeben und dann auswerten?

was sollen die \1 bedeuten? das ist doch eher sed syntax ?!?
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-07-12 23:48
#112039 #112039
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
ok sorry,habs verstanden, hatte Tomaten auf den Augen...die Ersetzung hat ja funktioniert ...

aber ich vermute das man mit qr() was lesbareres basteln kann...

NACHTRAG: falsch vermutet, qr hilft nur bei Pattern ...
TMTOWTDYOG (there's more than one way to dig your own grave)
nepos
 2008-07-13 12:37
#112040 #112040
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
das ist bestimmt wieder eine diese "wir bleiben Rückwärtskompatibel zu Perl 0"-Fossilien, wie diese schrägen Sonderbedeutungen von .. und ... !

Nein, ist es nicht. Es ist ganz normal, dass du mit \ Zeichen escapst bzw. mit \xxx Zeichencodes direkt angibst.
#Kein Kommentar
 2008-07-13 00:06
#112041 #112041
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
qr hat ich auch ausprobiert, hat aber nichts geholfen, da man es nur bei dem suchmuster verwenden kann, ich brauchte aber das ersetzungsmuster
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
betterworld
 2008-07-13 04:25
#112042 #112042
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
KurtZ+2008-07-12 21:30:43--
was sollen die \1 bedeuten? das ist doch eher sed syntax ?!?


\1 tut oft das Gleiche wie $1. Wobei $1 eigentlich zu bevorzugen ist, weil \1 halt auch fuer chr(1) steht und perl immer sehr heuristische Tricks machen muss, um es davon zu unterscheiden.

Im linken Teil von s/// ist es allerdings die einzig moegliche Variante, auf Klammerinhalt zuzugreifen:
Code: (dl )
s#([a-z])\1##g;

(entfernt doppelte Kleinbuchstaben)
KurtZ
 2008-07-13 06:22
#112043 #112043
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
betterworld+2008-07-13 02:25:00--
\1 tut oft das Gleiche wie $1. Wobei $1 eigentlich zu bevorzugen ist, weil \1 halt auch fuer chr(1) steht und perl immer sehr heuristische Tricks machen muss, um es davon zu unterscheiden.


mann oh mannnnnnn ... lernt nie aus! das mit der linken seite war mir klar, aber rechts schockt mich mal wieder heftig:
Code (perl): (dl )
1
2
3
  
DB<1> ($x='abc')=~s/(\w)/.\1/g ; print $x
.a.b.c


das ist bestimmt wieder eine diese "wir bleiben Rückwärtskompatibel zu Perl 0"-Fossilien, wie diese schrägen Sonderbedeutungen von .. und ... !
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2008-07-12 21:22.