Forum: Italian Ruby user group Magheggio regexp per split stringa

Posted by Marco Mastrodonato (marcomd)
on 2012-09-11 10:22
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?
Posted by Matteo Latini (Guest)
on 2012-09-11 10:31
(Received via mailing list)
Scusa ma la "lunghezza variabile"  solo un riempimento di zeri o sono 
numeri randomici?

--
Matteo Latini
http://nebulab.it/
Posted by Davide Rambaldi (Guest)
on 2012-09-11 10:33
(Received via mailing list)
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? :-)
Posted by Marco Mastrodonato (marcomd)
on 2012-09-11 10:39
Si variabile con solo zeri a porzioni di 6
Posted by Davide Rambaldi (Guest)
on 2012-09-11 10:41
(Received via mailing list)
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.
Posted by Andrea Pavoni (apeacox)
on 2012-09-11 10:44
(Received via mailing list)
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:
Posted by Andrea Pavoni (apeacox)
on 2012-09-11 10:50
(Received via mailing list)
soluzione leggermente pi elegante ;-)

"190611250412000000000000".match(/(\d{6})/).to_a
   => ["190611", "190611"]

ciao,
A.
Posted by Marco Mastrodonato (marcomd)
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!
Posted by Marco Mastrodonato (marcomd)
on 2012-09-11 11:12
Anzi non funziona, mostra sempre il primo blocco. Comunque grazie 
ugualmente per lo spunto
Posted by Davide Rambaldi (Guest)
on 2012-09-11 11:20
(Received via mailing list)
bug! ritorna due volte 190611 e skippa 250412
Posted by Davide Rambaldi (Guest)
on 2012-09-11 11:25
(Received via mailing list)
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!
Posted by Andrea Pavoni (apeacox)
on 2012-09-11 11:34
(Received via mailing list)
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.
Posted by Davide Rambaldi (Guest)
on 2012-09-11 11:36
(Received via mailing list)
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
Posted by Marco Mastrodonato (marcomd)
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
Posted by Davide Rambaldi (Guest)
on 2012-09-11 12:27
(Received via mailing list)
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)
Posted by Marco Mastrodonato (marcomd)
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...
Posted by Davide Rambaldi (Guest)
on 2012-09-11 17:01
(Received via mailing list)
> 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
No account? Register here.