Magheggio regexp per split stringa

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?

Scusa ma la “lunghezza variabile” solo un riempimento di zeri o sono
numeri randomici?


Matteo L.

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? :slight_smile:

Tests con http://rubular.com/

(\d{6}) e poi rimuovi i gruppi con 000000

non e’ un oneline ma per me funzia.

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 M. ha scritto:

Si variabile con solo zeri a porzioni di 6

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!

Anzi non funziona, mostra sempre il primo blocco. Comunque grazie
ugualmente per lo spunto

soluzione leggermente pi elegante :wink:

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

ciao,
A.

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!

Il 11/09/2012 11:07, Davide R. 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 :wink:

A.

bug! ritorna due volte 190611 e skippa 250412

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

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

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)

la modestia e’ per i deboli, come anche i test:

ecco un esempio dei miei tests: http://pastie.org/4702099

:slight_smile:

Interessante il punto 15, ho trovato la tastiera dei klingon:
http://techbump.info/wp-content/uploads/2010/08/ef0c82c15c22974.jpg.jpg