Schrift
[thread]6808[/thread]

Inhalt zwischen 2 Ausdrücken entfernen



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
stb2050
 2005-03-22 13:38
#52844 #52844
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
Hi Ihr,

ich würde gerne in einer langen Variable mit viel Inhalt ($var) etwas entfernen:

<!--abc-->Das soll alles weg<!--abc-->

In der Variable soll der Teil zwischen den Kommentaren samt den Kommentaren entfernt werden. Die Kommentare sind immer gleich, der Inhalt dazwischen ist aber variabell.

In der Variable $var steht allerdings nicht nur das was entfernt werden soll, sondern auch noch jede Menge anderes.

Wie gehe ich am Besten vor?

LG
Steffen
esskar
 2005-03-22 13:44
#52845 #52845
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
my $var = "Vieles mehr am Anfang <!--abc-->Das soll alles weg<!--abc--> vieles mehr am Ende";
my $pattern = "<!--abc-->";

$var =~ s!($pattern).*($pattern)!$1$2!g;
print $var;
esskar
 2005-03-22 13:46
#52846 #52846
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
das g am Ende brauchst du nur dann, wenn mehrere solcher <!--abc-->Das soll alles weg<!--abc--> Teilstücke in dem String vorkommen!
stb2050
 2005-03-22 14:34
#52847 #52847
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
Hi esskbar,

danke für die schnelle Antwort :-) Funktioniert optimal.

LG
Steffen
esskar
 2005-03-22 14:50
#52848 #52848
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=stb2050,22.03.2005, 13:34]Hi esskbar[/quote]
fast!
pKai
 2005-03-22 15:45
#52849 #52849
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,22.Mar..2005, 12:44]
Code: (dl )
$var =~ s!($pattern).*($pattern)!$1$2!g;
[/quote]
Sollte nicht der Match samt Begrenzer beseitigt werden?
Also Eher
Code: (dl )
$var =~ s!($pattern).*($pattern)!!; # zu /g siehe unten

[quote=esskar,22.Mar..2005, 12:46]das g am Ende brauchst du nur dann, wenn mehrere solcher <!--abc-->Das soll alles weg<!--abc--> Teilstücke in dem String vorkommen![/quote]
nö, da .* gierig ist, wird es sowieso nur 1mal passen.

Folgendes geht ebenfalls:
Code: (dl )
$var =~ s!($pattern).*(\1)!!;
Wobei ich zu Vor- und Nachteilen dieser Lösung nichts sagen kann.

Wenn die Match-Zeichenkette aus der Variablen RegExp-Metazeichen enthalten könnte (hier im Bsp. nicht der Fall), ist man auf der sicheren Seite, wenn man [perldoc=-f quotemeta]-f quotemeta[/perldoc](<- non-functional Link ;) ) verwendet oder das entsprechenden \Q\E escape.
Ausser man will natürlich RexExpe übergeben.
I sense a soul in search of answers.
Taulmarill
 2005-03-22 17:44
#52850 #52850
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wenn du $1 und $2 nicht benutzt würde ich auch nicht klammern, da das nur unnötig performace zieht (die variablen müssen ja auch gefüllt werden). falls man trozdem gruppieren möchte ohne zu capturen, dann kann man auch mit (?:$pattern) klammern. da wird $1 dann nicht gefüllt.
siehe perldoc perlre
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Strat
 2005-03-22 18:53
#52851 #52851
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
nebenbei: .* frisst soviel wie moeglich, sucht also vom string ende her... und das kann bei groesseren dateien manchmal doch ganz schoen lange dauern, und z.B. bei mehreren Ausdruecken wie
Code: (dl )
<!--abc-->Das soll alles weg<!--abc-->Das nicht<!--abc-->Das soll alles weg<!--abc-->

auch das "Das nicht" entfernen...
Besser ist da .*?, was von dem ersten match her sucht...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pKai
 2005-03-22 20:23
#52852 #52852
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
@Taulmarill:
bei
Code: (dl )
$var =~ s!($pattern).*\1!!;
hat das verbliebene Klammerpaar ja sogar einen Sinn.
An Meinungen zu diesem Konstrukt (vs. $pattern x 2 im RE) wäre ich interessiert.

@Strat:
Vielleicht (wahrscheinlich?) war die Fragestellung ja sogar so gemeint. ;)
I sense a soul in search of answers.
Strat
 2005-03-23 10:06
#52853 #52853
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@pKai: kann leicht sein...

Bin auf dieses greedy/non-greedy Verhalten selbst mal hereingefallen und merkte es zuerst daran, dass ein script unerwarteterweise einige 100 MB RAM benoetigte, aber sehr wenige Daten produzierte (nein, war kein HTML-Templating System, sondern ein SQL-Templating System, und auch zu Zeiten, wo es da noch kaum was vernuenftiges fertiges gab (ich gedenke mein Perl-Mannbarkeitsritual nicht dadurch abzulegen, dass ich ein mehr oder weniger funktionierendes Mailversendemodul und ein HTML-Templating-System entwickle ;) )... da ich mich einfach vertippt hatte, dauerte es ein wenig, bis ich den fehler gefunden hatte...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2005-03-22 13:38.