mi aiutate a fare un espressione regolare per eliminare i prezzi da un stringa?
i prezzi sono nel formato € 123,00
mi aiutate a fare un espressione regolare per eliminare i prezzi da un stringa?
i prezzi sono nel formato € 123,00
codice:/(€[ ]?[\d\.]+(=?,\d+)?)/
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages
per mia curiosità, cosa cambia tra quella di Santino e quella che scrivo sotto?codice:/(€\s[\d\.,]+)/
Che ha meno roba inutile, come la character class per uno spazio letterale e il lookahead
Pero' \s e' meno preciso di " ", se ci si aspetta uno spazio conviene richiedere uno spazio, non un qualunque carattere "white space" (che comprende anche tab ad esempio).
Se poi il formato e' sicuro, e' meglio essere il piu' precisi possibile per evitare di matchare piu' del necessario, quindi se ci sono 2 numeri decimali meglio \d\d che \d+.
Inoltre le parentesi che racchiudono tutto il pattern sono inutili e, all'iterno di una character class, il punto non necessita di escape.
In breve
codice:/€ \d+,\d\d/
cmq, questa espressione:
fa il match corretto di:codice:(€\s?[\d\.]+(=?,\d+)?)
mentrecodice:il prezzo è € 127,00 il prezzo è €127,00. vero? il prezzo è €127,00, vero?
solo del primo caso.codice:(€\s[\d\.,]+)
EDIT: cmq non ci capisco molto di regexp, diciamo che sopravvivo con quel poco che conosco.
Ultima modifica di Santino83_02; 10-07-2015 a 15:17
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages
Si, e' per quello che e' MOLTO importante specificare con precisione cosa si vuole cercare. Se la domanda presenta "€ 127,00" come esempio, l'unica deduzione automatica e' che si voglia:
1. il carattere €
2. uno spazio
3. una sequenza di numeri
4. una virgola
5. una sequenza di DUE numeri
(e gia' il punto 3 e' comunque una generalizzazione per deduzione, perche' altrimenti si potrebbero anche cercare TRE numeri e non una sequenza indefinita)
Se lo spazio e' opzionale, o se puo' essere presente il punto separatore delle migliaia, allora va precisato. Scrivere un pattern piu' generico del necessario e' inutile e spesso dannoso.
La vera difficolta' di utilizzare bene le regular expressions non e' la sintassi, ma imparare a DESCRIVERE CON ESTREMA PRECISIONE quello che si sta cercando.
K.b. ovviamente scherzavo prima. Per questo avevo fatto una espressione più lunga (sbagliat, ndr, di seguito quella corretta) perchè non sapendo che cosa volesse veramente andare a matchare il richiedente, l'ho resa un pò più flessibile nel match.
ad esempio una versione rivista è la seguente (da prendere con il beneficio del dubbio):
che fa il match di:codice:(€\s?\d+(<?\.\d+)*(=?,\d+)?)
poi bejelit ci farà sapere che che cosa voleva fare il match o menocodice:il prezzo è € 127 il prezzo è € 127. vero? il prezzo è € 127, vero? il prezzo è € 127,00 il prezzo è €127,00. vero? il prezzo è €127,00, vero? il prezzo è € 1.127,00 il prezzo è € 1.127,00. vero? il prezzo è € 1.127,00, vero? il prezzo è € 1.127 il prezzo è € 1.127. vero? il prezzo è € 1.127, vero? il prezzo è € 1.127.345 il prezzo è € 1.127.345. vero? il prezzo è € 1.127.345, vero? il prezzo è € 1.127.345,00 il prezzo è € 1.127.345,00. vero? il prezzo è € 1.127.345,00, vero?![]()
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages