RegEx: Wie ersetzt man in $1, $2 usw.?

02/06/2008 - 22:49 von Johannes v. Löwis | Report spam
Hallo allerseits,

ich habe einen Text, in dem ich Teile der Form '<tt>x_y a_b</tt>' durch
'\texttt{x\_y a\_b}' ersetzen moechte. Die Zahl der zu ersetzenden
Underscores variiert von Stelle zu Stelle.

Mit dem regulaeren Ausdruck '/<tt>(.*?)<\/tt>/ms' erwische ich die
Stellen, jedoch weiss ich nicht, wie ich auf $1 dann noch ein
's/_/\\_/g' anwende. Geht das und wenn ja, wie?

Momentan behelfe ich mir mit einer while-Schleife und einer Funktion wie im
unten angegebenen Beispiel demonstriert. Allerdings stoert mich sowohl
die Schleife als auch der Umstand, dass in ihr der regulaere Ausdruck
'/<tt>(.*?)<\/tt>/' zweimal vorkommt. Das geht doch sicher auch
eleganter, oder?

Gruss und Dank im voraus

Johannes


#!/usr/bin/perl
use strict;
use warnings;

my $text="bla bla blub <tt>x_a x_b foo bar
y_c z_2</tt> bla bla blub
<tt>G_h l_m foo bar y_c z_2</tt>
bla blub bla";

print "Text vor dem Ersetzen:'$text'";

sub escape_ {
my $s = shift;
$s =~ s/_/\\_/gm;
return $s;
}

while ($text =~ m/<tt>(.*?)<\/tt>/ms) {
my $s = escape_($1);
$text =~ s/<tt>(.*?)<\/tt>/\\texttt{$s}/ms;
}

print "Text nach dem Ersetzen:'$text'";
 

Lesen sie die antworten

#1 Frank Seitz
03/06/2008 - 21:17 | Warnen spam
Johannes v. Löwis wrote:

Das geht doch sicher auch eleganter, oder?



$str =~ s/<tt>(.*?)<\/tt>/f($1)/ges;

sub f {
my $str = shift;
$str =~ s/_/\\_/g;
return "\\texttt{$str}";
}

Grüße
Frank
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Ähnliche fragen