# Ricerca con sostituzione e dubbio regex

**URL:** <https://www.ruby-forum.com/t/ricerca-con-sostituzione-e-dubbio-regex/215754>\
**Category:** IT\
**Created:** [January 14, 2012, 4:24pm UTC](https://www.ruby-forum.com/t/ricerca-con-sostituzione-e-dubbio-regex/215754 "2012-01-14T16:24:56Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![dubstep](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/cdc98d/32.png) [@dubstep](https://www.ruby-forum.com/u/dubstep)\
**Post date:** [January 14, 2012, 4:24pm UTC](https://www.ruby-forum.com/t/ricerca-con-sostituzione-e-dubbio-regex/215754/1 "2012-01-14T16:24:56Z")

</div>

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 🙂

Mao

---

<div class="post-metadata">

**Author:** ![mao\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f04885/32.png) [@mao\_m](https://www.ruby-forum.com/u/mao_m)\
**Post date:** [January 14, 2012, 4:47pm UTC](https://www.ruby-forum.com/t/ricerca-con-sostituzione-e-dubbio-regex/215754/2 "2012-01-14T16:47:37Z")

</div>

Il giorno 14 gennaio 2012 16:24, Mao M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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

---

<div class="post-metadata">

**Author:** ![mao\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f04885/32.png) [@mao\_m](https://www.ruby-forum.com/u/mao_m)\
**Post date:** [January 16, 2012, 4:42pm UTC](https://www.ruby-forum.com/t/ricerca-con-sostituzione-e-dubbio-regex/215754/3 "2012-01-16T16:42:54Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![mao\_m](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f04885/32.png) [@mao\_m](https://www.ruby-forum.com/u/mao_m)\
**Post date:** [January 16, 2012, 8:04pm UTC](https://www.ruby-forum.com/t/ricerca-con-sostituzione-e-dubbio-regex/215754/4 "2012-01-16T20:04:18Z")

</div>

2012/1/14 Mao M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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](http://riffraff.blogsome.com)  
work: [cascaad.com](http://cascaad.com) [circleme.com](http://circleme.com)
