Ricerca con sostituzione e dubbio regex

Salve a tutti!
Mi diletto ogni tanto nella programmazione con ruby e ultimamente mi
sono imbattutto in questo problema a cui non trovo soluzione. Quello che
vorrei fare è sostituire dei caratteri che si trovano in un pattern ben
preciso. Nello specifico il pattern completo è una lettera, 4 numeri e
due lettere (es. A1234BB) e la sostituzione da fare è nello specifico
sui 4 numeri. Ad esempio una cosa del tipo: se uno dei 4 caratteri tra
la prima lettera e le ultime due è una O (o lettera), sostituiscilo con
uno 0 (zero) (es. A1O23CO => A1023CO ).
Il secondo problema con le regex è il seguente.
Con le regex riesco ad individuare un pattern ben specifico, ma non ma
non lo stesso escluso degli estemi. Facciamo l’esempio che debba
recuperare in una stringa tutti i contenuti all’interno di parentesi
quadre (es. di [ciao] => ciao ). Il pattern sarebbe /(\w*)/ ma così mi
selezionerebbe anche le parentesi, invece io voglio solo la parte \w*.
L’unica cosa che mi è venuta in mente è di fare due regex in sequenza
(prima /(\w*)/ e poi /\w*/) ma mi chiedevo se esistesse un modo più
elegante ed in un singolo passaggio.
Grazie a tutti dell’attenzione :slight_smile:

Mao

Il giorno 14 gennaio 2012 16:24, Mao M. [email protected] ha scritto:

Il secondo problema con le regex il seguente.
Con le regex riesco ad individuare un pattern ben specifico, ma non ma
non lo stesso escluso degli estemi. Facciamo l’esempio che debba
recuperare in una stringa tutti i contenuti all’interno di parentesi
quadre (es. di [ciao] => ciao ).

Per il secondo problema:

ruby-1.9.2-p290 :001 > str = “[ciao]”
=> “[ciao]”
ruby-1.9.2-p290 :002 > m = str.match(/[(\w*)]/)
=> #<MatchData “[ciao]” 1:“ciao”>
ruby-1.9.2-p290 :003 > m[1]
=> “ciao”
ruby-1.9.2-p290 :004 >

Questa e’ una sessione di IRB. Data la stringa “str” con valore
“[ciao]”, la reg expr /[(\w*)]/ effettivamente individua la stringa
“[ciao]” pero’, come puoi notare, la porzione di reg expr \w* e’
racchiusa tra parentesi tonde. Le parentesi tonde senza l’escape
creano un gruppo composto da tutti i caretteri della parola escluse le
due parentesi quadre.

Come puoi notare, il metodo “match” resistuisce un oggetto MatchData:
#<MatchData “[ciao]” 1:“ciao”> che ha eseguito il match di “[ciao]”
ma possiede anche una backreference 1 con “ciao”. Puoi accedere alla
backreference con m[1] ed ottenre la parola dentro le parentesi
quadre, senza queste ultime.

Andrea

Per il primo:

non sono un esperto di regexp e non saprei come farlo in un unico
passaggio ma eviterei soluzioni da mal di testa, io farei qualcosa del
genere:

str = “A123OBB”
regexp = /^[A-Z][0-9]{4}[A-Z]{2}$/
str = “#{str[0…0]}#{str[1…4].gsub(/[A-Z]/,‘0’)}#{str[5…6]}” unless
regexp === str

in pratica con la regexp controlli che sia nel formato corretto
altrimenti effettui la sistemazione

2012/1/14 Mao M. [email protected]:

Salve a tutti!
Mi diletto ogni tanto nella programmazione con ruby e ultimamente mi
sono imbattutto in questo problema a cui non trovo soluzione. Quello che
vorrei fare sostituire dei caratteri che si trovano in un pattern ben
preciso. Nello specifico il pattern completo una lettera, 4 numeri e
due lettere (es. A1234BB) e la sostituzione da fare nello specifico
sui 4 numeri. Ad esempio una cosa del tipo: se uno dei 4 caratteri tra
la prima lettera e le ultime due una O (o lettera), sostituiscilo con
uno 0 (zero) (es. A1O23CO => A1023CO ).

se hai una struttura cos rigida, e la cifra da sostituire zero,
molto meglio fare senza regex imo, come ha fatto marco.

Comunque, forse volevi una cosa del tipo:
re = /
(?<=[a-z]) #positive lookbehind del primo pezzo, cio “questo ci
deve essere prima ma non lo voglio”
([a-z0-9]){4} # il pezzo da sostituire
(?=[a-z]{2}) # positive lookahead del pezzo finale, come sopra con
s/dopo/prima/
/xi
=> “A1204BB”

‘A12A4BB’.gsub(re) {|match| match.gsub(/o/i,‘0’)}
=> “A12A4BB”


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: cascaad.com circleme.com