Newsgroup: it.comp.lang.perl
Titolo: espressioni regolari

Ciao a tutti,
scusate se la domanda vi sembra banale...
ho una stringa all'interno della quale ho dei valori delimitati da due
underscore (_)
es:
vdjklnmvjdn__valore__jncjwnjcew__valore2__
io avrei bisogno di memorizzare in un array il contentuto della stringa
contenuto tra i due underscore...
qual'è l'espressione che mi permette di fare ciò???
Ciao,
    Ivan

Amatullo wrote:

Non si capisce bene cosa voglia, ma questo mi sembra si avvicini un po' 
alla tua richiesta:
$string='vdjklnmvjdn__valore__jncjwnjcew__valore2__';
@array=split(/__/,$string);
avrai:
$array[0]='vdjklnmvjdn';
$array[1]='valore';
$array[2]='jncjwnjcew';
$array[3]='valore2';
-- 
Saluti,
Giancarlo

 wrote in message
news:aneig1$n1i$1...@stargate1.inet.it...


 vnsdfnvkfdj_valore1__vjnjkvdkjnvfdkjvf__valore2__vfdvflfvdlb,dflàbdfs
anche vjnjkvdkjnvfdkjvf e' compresa tra due coppie di _.
Quindi il fatto di essere "contenute tra due serie di underscore" non 
identifica univocamente valore1 e valore2, mi sa che tu debba usare 
qualche altra logica per discriminarli.
Ad esempio:
- sono sempre gli elementi 1 e 3 dell'array generato split-tando su 
'__'?
- la lunghezza dei vari pezzi di stringa e' per caso fissa?
- c'e' qualche altra caratteristica che distingue valore1 da 
vjnjkvdkjnvfdkjvf o valore2 da vnsdfnvkfdj?
-- 
Saluti,
Giancarlo

qual'è l'espressione che mi permette di fare ciò???
C'e' un'ambiguita' riguardo a quando un valore si intende "delimitato da
due underscore". Risolta l'ambiguita' in un certo modo, che mi pare possa
essere quello che intendi tu, un'espressione potrebbe essere:
   @valori = ($stringa =~ /_([^_]+)_/g);
Cosi' otterresti, dal tuo esempio:
   @valori = ("valore", "valore2");
saltando "jncjwnjcew", che e' pure anch'essa "delimitata da due
underscore".
Ciao.

 underscore".
Non mi sembra che "jncjwnjcew" venga saltata.
-- 
Saluti,
Giancarlo

 >qual'č l'espressione che mi permette di fare ciň???


 in questo caso non mi da la stringa 'x_prova '
Ma si che č facile:
$str = 'vcdfmfjd__x_prova__vdfkjnvfdkjv__pippo__nd';
(@valori) = $str =~ /__(\w+?)__/ig;
print "@valori";
ciao
Domizio Demichelis

 wrote in message
news:anemlm$dm15g$1...@ID-159100.news.dfncis.de...


 Domizio ti voglio bene!!!
OK, allora per dimostrarmelo, per invogliarci tutti ad aiutarti in futuro, e per
farti un favore, scrivici qui che hai capito cosa fa e a cosa servono le varie
parti della RE che cercavi ;-)
@valori = $str =~ /__(\w+?)__/ig;
Altrimenti continuerai sempre ad aver bisogno che qualcono ti dia il pezzettino
di code che ti serve e non imparerai come trovarlo da solo. Scrivi la tua
descrizione di COME questa cosa funziona, e ti aiuteremo a colmare le tue
eventuali lacune, OK?
ciao
dd

Non mi sembra che "jncjwnjcew" venga saltata.
Se ci avesse messo un underscore solo, come tutte le persone per bene, lo
salterebbe eccome, lo salterebbe, accidentallui! (Ho letto male l'esempio.)
Questa funziona con i due underscore dell'esempio:
  @valori = ($stringa =~ /__([^_]+)__/g);
.... pero` non funziona con l'esempio successivo:
  vcdfmfjd__x_prova__vdfkjnvfdkjvnd
Ma e` possibile sapere una volta per tutte come sono fatti questi dati?
Ciao.

in questo caso non mi da la stringa 'x_prova '
Eccicredo! "x_prova" contiene un underscore, e non puo` essere quindi
catturata da ([^_]+) che richiede, per l'appunto, che underscore non ci
siano.
C'e` un modo per dire a questo accidenti di perl che voglio la cosa piu`
piccola e non la piu` grande? Perche' col mio editor avrei modo di far
funzionare un'espressione cosi`: /__(.+)__/ .
L'unica idea che mi viene in questo momento e` andar avanti a colpi di index
e substr, anche se immagino che si dovrebbe riuscire a fare con /gc e \G, o
forse con qualche look ahead.
Ciao.

 wrote in message
news:aneplu$dicpv$1...@ID-159100.news.dfncis.de...


 di far funzionare un'espressione cosi`: /__(.+)__/ .
 
  /__(.+?)__/
Max

 forse con qualche look ahead.
Ma che vita complicata fai? :-)
C'è il ? dopo un * o un + che fa proprio esattamente quello che ti manca per non
suicidarti :-)... becca appunto la cosa più piccola (la più vicina per
l'esattezza) e non la più grande ;-)
/__(.+?)__/
ciao
dd

 Non capisco bene l'utilizzo del punto di domanda...
Come gà scitto a Giovanni... becca il primo mach invece che l'ultimo.
$str = '__X___X__X__';
($result) = $str =~/(X\w+X)/;
print $result; # X___X__X
($result) = $str =~/(X\w+?X)/;
print $result; # X___X
ciao
dd

/__(.+?)__/
Eccolo li'!
Ma... appicicarci un altro significato ancora a questo '?' non era proprio
possibile? Perche' dico, gia' e' un quantificatore di suo ("c'e' e non
c'e'"), poi introduce le espressioni estese, poi fa da modificatore degli
altri quantificatori... altro? (Dico, all'interno delle espressioni
regolari; mi sta anche bene che significhi cose diverse in ambiti diversi.)
Perche' per completare mancherebbe la possibilita' di definire pattern
"comincia prima" o "finisce prima".
Ciao.