An einen regulären Ausdrucks Experten - Mit der großen BITTE um Hilfe.
Micha
- perl
Hi!
Ich will in einer Variablen nach dem Wort "self" und allem was dahinter folgt suchen - bis zum Ende oder bis zum Wort "html". Also eigentlich nix kompliziertes, dachte ich - wahrscheinlich stehe ich momentan auch nur ziemlich auf der Leitung?
Das ganze wollte ich mit folgendem Ausdruck machen: $test=~/self((.(?!htm))*)/i;
Mir ist auch absolut klar, wieso das nicht wie gewollt funktioniert, da ja erst wenn für das Muster vor dem (?!...) ein Teilstring gefunden wurde, überprüft wird, ob sich daran der Ausdruck in der Klammer anschließt. Ich weiß aber leider nicht wie es schreiben muß, damit ich zu meinem gewünschtem Ergebnis komme.
Wäre echt sehr dankbar wenn mir jemand erklären könnte wie ich es machen muß.
Ciao
Micha
PS.: Nochmal zum besseren Verständnis folgendes Testscript:
#!/usr/bin/perl
@test=('test', 'it is self-made', 'SelfHtml', 'SelfWebHtml');
$test[0]=~/self((.(?!htm))*)/i;
print "$&\n";
$test[0]: Logo, da wird nix gefunden - so solls auch sein
$test[1]: Hier wird "self-made" gefunden - ist auch richtig
$test[2]: Hier wird "SelfHtml" gefunden - das will ich nicht so, es soll hier nur "Self" gefunden werden
$test[3]: Hier wird "SelfWe" gefunden - fast richtig, es soll "SelfWeb" gefunden werden
Hi,
Ich will in einer Variablen nach dem Wort "self" und allem was dahinter folgt suchen - bis zum
Ende oder bis zum Wort "html".
hm, daß hier müßte es tuen:
$var =~ /(self.*(html$))/
ist allerdings ungetestet.
mfg
CK1
auch hi :-)
$var =~ /(self.*(html$))/
der duerfte zu gierig sein (also auch sowas wie "self html html" matchen (self html) )
hier meine loesung:
@test=('test', 'it is self-made', 'SelfHtml', 'SelfWebHtml');
foreach $test(@test){
$test=~/(self(?:.(?!tml))*)(?:html$)/is; # fuers archiv am schluss steht (?: html pipezeichen $ )
print "$1\n";}
/s ist nur, damit der . auch evtl. \n im string erkennt.
achso, bei performanteren Geschichten wuerde ich auf $& verzichten, diese Variable ist ziemlich verpoent :-)
cua
n.d.p.
Hi,
$var =~ /(self.*(html$))/
der duerfte zu gierig sein (also auch sowas wie "self html html" matchen (self html) )
hier meine loesung:
@test=('test', 'it is self-made', 'SelfHtml', 'SelfWebHtml');
foreach $test(@test){
$test=~/(self(?:.(?!tml))*)(?:html$)/is; # fuers archiv am schluss steht (?: html pipezeichen $ )
print "$1\n";}
also, eigentlich sollte
$var =~ /(self.*?(html$))/
reichen, um das ganze "un"-greedy zu machen.
mfg
CK1
Vielen Dank n.d.p. und CK1!
Mit folgendem Script funktioniert jetzt alles einwandfrei - auf die Sache mit $ in einer Oderverknüpfung wäre ich nie gekommen:
#!/usr/bin/perl
@test=('test', 'it is self-made', 'SelfHtml', 'SelfWebHtml', 'SelfHtmlHtml');
foreach $test (@test) {
$test=~/(self.*?)(html$)/i;
print "$\n";}
Danke auch für den Hinweis bezüglich Geschwindigkeit und $&
Freundliche Grüße
Micha