Newsgroup: it.comp.lang.perl
Titolo: regex

ciao
la stringa č cosě:
"quello che voglio ciao 13131 $"$"Ł$" name="nomecampo" altri caratteri"
e deve diventare
nomecampo
sto provando a fare la regex, per il momento sono arrivato a questo
s/(\.*) name="(\w*)" (\.*)/$2/; print "$_";
che non funziona...
help please ;-)
Mario
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Mario
C'eri quasi:
<CODE>
use strict;
use warnings;
my $string = 'quello che voglio ciao 13131 $"$"£$" name="nomecampo"
altri caratteri';
if($string =~ /(\.*) name=\"(\w*)\" (\.*)/) {
  print $2;
}
</CODE>
Così funziona.
Ciao,
-- 
+--------+ ASCII ribbon campaign ( )
|  kral  |  - against HTML email  X 
+--------+              & vCards / \

ottimo, ora uso questa
if ( /(\.*)name=\"(\w*)\"(\.*)/) { print "$2\n";}
e funziona perfettamente.
Ora la sto modificando in modo che prenda solo stringhe del tipo
quello che voglio input qua dell'altra roba name="pippo" altri caratteri
numeri simboli
in pratica si aggiunge che la stringa DEVE contenere anche la parola
input...
la nuova regex che userei è questa:
if ( /(\.*)input(\.*)name=\"(\w*)\"(\.*)/){ print "$3\n"; };
ma ancora non funziona...
(prevedo acquisto manuale regex a breve...)


s/(\.*) name="(\w*)" (\.*)/$2/; print "$_";
Se ci metti l'escape diventa letteralmente un punto; essendo sequenze
soddisfatte anche dalla stringa nulla, tutto quello che fai č cancellare
" name=".
Semmai:
    s/(.*)name="(\w*)"(.*)/$2/;
    print $_;
Ma francamente a me sembra piů logico catturare quello che serve e basta:
    s/.*name="(\w*)".*/$1/;
    print $_;
O, ancor meglio:
  ($campo) = ($_ =~ /name="(\w*)"/);
  print $campo;
Ciao.

ma ancora non funziona...
Certo che no, per il motivo sopra: stai cercando 0 o più punti ('.'), ma
nella stringa di esempio tra "input" e "name" ci sono altri caratteri.
Ciao.

 if ( /(\.*)name=\"(\w*)\"(\.*)/) { print "$2\n";}
	^^^^
\.* 
significa uno o più ``carattere punto,'' quel che intendi tu è:
.* 
ovvero qualsiasi carattere ripetuto una o più volte, dovresti rimuovere
lo slash ..
	Paolo 
-- 
<!--_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
                      The Hacking Pages   
 
www.lulli.net
 
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-->

 if ( /(\.*)name=\"(\w*)\"(\.*)/) { print "$2\n";}



teoricamente si potrebbe fare in modo ancora piu` efficiente anche con
(??{ code }), ma per ora il parsing estremo ha qualche bug sul parentesismo.
provata ( END{use Data::Dumper;print Data::Dumper->Dump([\%h],[h]);} )
ad esempio con la stringa:
mo b='sec ondo' c="te\"rzo" z=last ha ancora='u\'n\'o' s="s p aziale" n="norm"
che viene sostituita con:
mo sec ondo te\"rzo lastha u\'n\'o s p aziale norm
$h = {
       'n' => 'norm',
       'c' => 'te\"rzo',
       'b' => 'sec ondo',
       'ancora' => "u\'n\'o",
       's' => 's p aziale',
       'z' => 'last'
     };
quindi sono inizializzate le variabili $h{n}='norm', $h{c}='te\"rzo' ecc..
NB: Potete usare queste mie regexp, purche` manteniate immutata
    l'informazione sull'autore.
Saluti,
MARco   
http://mar.i.am/co/
-- 
x(t),y(t) = th(3t-34.5)*e^[-(3t-34.5)^2]/2-4.3+e^(-1.8/t^2)/(.8*atg(t-
3)+2)(t-1.8)-.3th(5t-42.5),(1.4e^[-(3t-34.5)^2]+1-sgn[|t-8.5|-.5]*1.5*
|sin(pi*t)|^[2e^(-(t-11.5)^2)+.5+e^(-(.6t-3.3)^2)])/(.5+t)+1  ; 0<t<14
Il medioevo moderno e` fondato su illogical dominis