Newsgroup: it.comp.lang.javascript
Titolo: RegExp e le graffe

Ciao a tutti devo sostituire delle parole con delle graffe all'interno
di un testo. Su firefox tutto bene
var reg = new RegExp('{parola}', 'g');
reg.compile();
testo.replace(reg, 'nuova_parola');
ma su Opera questo non funziona. Ho scoperto che e' il carattere della
graffa a fare casotti anche perche' e' uno dei caratteri speciali nelle
espressioni regolari. Ma come faccio a dirgli che per me e' una semplice
graffa e non ha significati particolari? ho provato un escape alla c
\{parola\} ma senza alcun risultato
Grazie

 \{parola\} ma senza alcun risultato
esatto, in generale la sintassi è quella per indicare che un carattere
"speciale" è da considerarsi un carattere "normale".
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

 ho provato un escape alla c \{parola\} ma senza alcun risultato
Questo perché forse l'hai scritto direttamente nella stringa, in questo
modo:
	var reg = new RegExp('\{parola\}', 'g');
Ma così facendo, hai fatto l'escape a livello di stringa, non a livello di
regexp. Devi passare alla regexp il carattere "\" quindi se lo inserisci in
una stringa, lo devi raddoppiare:
	var reg = new RegExp('\\{parola\\}', 'g');
Se tu invece avessi scritto la regexp letterale, non ne avresti avuto
bisogno (ma immagino che "parola" sia variabile):
	var reg = /\{parola\}/g;
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 	var reg = new RegExp('\{parola\}', 'g');
pensavo anch'io fosse lo \, ma poi nel test ho tolto lo \ e ha funzionato
tutto comunque...
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is done
 don't sit down, it's time to dig another one"
									    P.F.

 tutto comunque...
Questo perché probabilmente il parser della regexp si accorge che l'uso
delle graffe non matcha la sintassi nella quale vengono usate.
Ciò non toglie che sono un carattere utilizzato nella sintassi delle RegExp,
e quindi è bene farne l'escape, soprattutto perché non è detto che tutti i
parser siano così intelligenti.
E l'escape non viene fatto in quel modo, se si utilizza una stringa per
generare un oggetto RegExp, è questo il punto fondamentale.
Sono pressoché sicuro che se "parola" è un valore numerico, tipo "1", il
parser delle RegExp ti risponde picche.


 tutto comunque...
Questo perché probabilmente il parser della regexp si accorge che l'uso
delle graffe non matcha la sintassi nella quale vengono usate.
Ciò non toglie che sono un carattere utilizzato nella sintassi delle RegExp,
e quindi è bene farne l'escape, soprattutto perché non è detto che tutti i
parser siano così intelligenti.
E l'escape non viene fatto in quel modo, se si utilizza una stringa per
generare un oggetto RegExp, è questo il punto fondamentale.
Sono pressoché sicuro che se "parola" è un valore numerico, tipo "1", il
parser delle RegExp ti risponde picche, senza un adeguato escape.


 parser delle RegExp ti risponde picche, senza un adeguato escape.
sicurissimo anch'io


 sicurissimo anch'io
Uhm, allora mi sfugge la ragione d'essere del tuo precedente post. :)


 Uhm, allora mi sfugge la ragione d'essere del tuo precedente post. :)
era per sottolineare proprio il fatto che il compilatore è "intelligente":
mi aspettavo errore, invece probabilmente vede che non c'è un numero (o 2
numeri separati da virgole) tra le graffe e quindi le interpreta come
carattere normale (chissà cosa fa con {1,parola})
Non ho provato con un numero ma senza nulla davanti, magari è "così
intelligente" che le considera caratteri normali anche in quel caso (ma mi
puzza...)
Testato con Firefox 1.5, opera 8.5, IE6.0sp1.
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 era per sottolineare proprio il fatto che il compilatore č "intelligente":
Che quelli che hai provato, sono intelligenti. Dato che ogni browser e
linguaggio lo implementa differentemente dagli altri, non č detto che sia
cosě per tutti.
Per questo l'escape ci deve andare. Il tuo post lasciava presumere che se ne
potesse tranquillamente fare a meno, e non vorrei che qualcuno si lasciasse
traviare. :)


       var reg = new RegExp('\\{parola\\}', 'g');
Ecco l'inghippo!
Grazie mille per il prezioso aiuto! in effetti usavo un unico slash con
due funziona
Ciao
Fabio

Si ti chiedo scusa ho creato io un esempio al volo perche' non avevo
sotto mano l'originale e devo averci infilato qualche cavolata.
Questo e' il pezzetto di codice che uso:
var s;
var reg;
for(e in data){
        s = "#\{" + e + "\}";
        reg = new RegExp(s,"g");
        tmp = tmp.replace(reg, data[e]);
}
return tmp;
Opera mi da questo errore :
message: Statement on line 25: RegExp.prototype.compile: syntax error in
pattern or string
Mentre su Firefox e IE non da problemi
aggiungo che l'ho provato su Opera 8 e 9 (entrambi su os x) e il
risultato non cambia
Ciao & Grazie
Fabio

 return tmp;
boh, io cosě al volo (ora non ho tempo per testarlo) non vedo errori ...
potrebbe essere qualcosa in "e" che non va bene?
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 due funziona
e come faceva a funzionare con gli altri browser?
boh
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.

 e come faceva a funzionare con gli altri browser?
Mi sfugge qualcosa.
L'abbiamo detto prima: in quei casi il parser di RegExp è "intelligente" e
si accorge che le quadre non sono utilizzate nella normale sintassi, e le
considera come se fossero già in escape.
Ma non è detto che tutti i parser di RegExp siano altrettanto
"intelligenti", ed è quindi bene fare ugualmente l'escape di tali caratteri.
Così si è sicuri di rispettarne la sintassi.
(Come già detto in questo stesso thread)


 considera come se fossero già in escape.
eh, ma da prove da me fatte (Con la sintassi diversa, ma immagino passi
sempre dallo stesso compilatore) Opera si comportava esattamente come gli
altri browser.
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 due funziona
Di nulla figurati. Spero di essere stato chiaro sul perché servano due
slash.


 altri browser.
Ma evidentemente non hai provato le versioni che ha provato l'OP sul
medesimo sistema operativo.
E neanche io, per carità. Ma ho semplicemente applicato la massima che
preferisco (quella della sign).
Per quanto se ne poteva dedurne dal primo post, poteva anche essere una
versione di Opera vecchia, quella provata da wezzy, o su un sistema
operativo diverso. Quindi non ho dato per scontato che fosse l'ultima
versione, su windows; né tantomeno che il parser fosse "intelligente".
Dato il tipo di errore, e i dati forniti, la risposta più logica mi è
sembrata quella che ho dato.


 slash
si in effetti la cosa e' logica

 si in effetti la cosa e' logica
Perfetto. Buona programmazione, allora :)
