Una stringa può essere di lunghezza variabile e parzialmente riempita con una data nel formato GGMMAA, esempio con due date. str = '190611250412000000000000' devo trasformarla in un array ed in ogni elemento una data, scartando il resto: ['190611','250412'] come faccio ad ottenere questo risultato con una sola riga di codice?
on 2012-09-11 10:22
on 2012-09-11 10:31
Scusa ma la "lunghezza variabile" solo un riempimento di zeri o sono numeri randomici? -- Matteo Latini http://nebulab.it/
on 2012-09-11 10:33
Direi che l'elemento chiave e' il doppio zero (00) in quanto non ci sono date con 00 (almeno fino al 2100 ) per quanti anni ti serve? :-)
on 2012-09-11 10:41
Tests con http://rubular.com/ (\d{6}) e poi rimuovi i gruppi con 000000 http://rubular.com/r/cJ9vXNTjEM non e' un oneline ma per me funzia.
on 2012-09-11 10:44
una soluzione un po' hardcoded, potrebbe essere questa:
> "190611250412000000000000".split(/([0-9]{6})/).reject {|t| t.size != 6 || t ==
'000000' }
=> ["190611", "250412"]
dipende se il "resto" composto da soli zeri, e le date sono sempre
formate da
gruppi di 6 numeri
ciao,
A.
Il 11/09/2012 10:22, Marco Mastrodonato ha scritto:
on 2012-09-11 10:50
soluzione leggermente pi elegante ;-)
"190611250412000000000000".match(/(\d{6})/).to_a
=> ["190611", "190611"]
ciao,
A.
on 2012-09-11 11:03
L'ultima è perfetta e mi piacerebbe capire perchè scarta i blocchi con gli zeri. @Davide Grazie per il sito, per check veloci è molto comodo. Come alternativa io creo un file di testo e ci ficco dentro tutti i possibili casi poi li testo con l'editor in modalità regexp. Grazie comunque ad entrambi, mi avete evitato un bel mal di testa!
on 2012-09-11 11:12
Anzi non funziona, mostra sempre il primo blocco. Comunque grazie ugualmente per lo spunto
on 2012-09-11 11:25
An the winner is:
"190611250412000000000000".scan(/\d{6}/).reject{|t| t.size != 6 || t ==
'000000' }
con scan .
=> ["190611", "250412"]
Ciao
Davide
sono bravo? eh sono bravo? dai ditemi che sono bravo!
on 2012-09-11 11:34
Il 11/09/2012 11:07, Davide Rambaldi ha scritto:
> bug! ritorna due volte 190611 e skippa 250412
ahaha! che cantonata che ho preso, troppo di corsa. spero comunque che
tu abbia
trovato un po' di spunti in merito ;)
A.
on 2012-09-11 11:36
il mio funziona ed e' un one liner. Devi usare scan
"190611250412000000000000".scan(/\d{6}/).reject{|t| t.size != 6 || t ==
'000000' }
=> ["190611", "250412"]
Davide
on 2012-09-11 12:15
Si Andrea, grazie del prezioso contributo.
Davide, lasciando per un momento da parte la modestia, la tua soluzione
funziona e la preferisco in questa variante:
"190611250412000000000000".scan(/\d{6}/).select{|t| regexp === t}
dove regexp controlla anche il formato delle date:
regexp = /(0[1-9]|[12]\d|3[01])(0[1-9]|1[012])(\d[1-9]|[1-9]0)/
la regexp di controllo l'ho creata io dalle mie umili basi, non l'ho
testata bene e non so forse si può migliorare
on 2012-09-11 12:27
la modestia e' per i deboli, come anche i test: http://gradha.sdf-eu.org/textos/klingon_programmer.en.html W i klingon! (scusate momento troll)
on 2012-09-11 12:35
Interessante il punto 15, ho trovato la tastiera dei klingon: http://techbump.info/wp-content/uploads/2010/08/ef...
on 2012-09-11 17:01
> la modestia e' per i deboli, come anche i test: ecco un esempio dei miei tests: http://pastie.org/4702099 :-)
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.