# Espressioni regolari: gsub

**URL:** <https://www.ruby-forum.com/t/espressioni-regolari-gsub/150997>\
**Category:** IT\
**Created:** [October 15, 2008, 6:08pm UTC](https://www.ruby-forum.com/t/espressioni-regolari-gsub/150997 "2008-10-15T18:08:25Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![arnaudo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7ba0ec/32.png) [@arnaudo](https://www.ruby-forum.com/u/arnaudo)\
**Post date:** [October 15, 2008, 6:08pm UTC](https://www.ruby-forum.com/t/espressioni-regolari-gsub/150997/1 "2008-10-15T18:08:25Z")

</div>

Ciao a tutti,  
vorrei modificare il formato di una data in un file, eliminando il  
simbolo slash (/).

Ho provato nel modo seguente, ma senza risultato, in quanto si aspetta  
una stringa

line.gsub(/: /, ‘’ ).gsub(/[0-9]/[0-9]/,/[0-9][0-9]/)

sapete suggerirmi la formula corretta?

Grazie  
Massimo

---

<div class="post-metadata">

**Author:** ![arnaudo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7ba0ec/32.png) [@arnaudo](https://www.ruby-forum.com/u/arnaudo)\
**Post date:** [October 15, 2008, 7:48pm UTC](https://www.ruby-forum.com/t/espressioni-regolari-gsub/150997/2 "2008-10-15T19:48:31Z")

</div>

Se ho capito hai delle date in un file tipo “31/12/2002”.  
posto d = “31/12/2002”, allora…

se devi semplicemente togliere lo slash:  
d.gsub("/","")

se devi trasformarla in “aaaa-mm-gg”:  
d.split(///).reverse.join("-")

O devi controllare che sia una data valida?

Il giorno 15/ott/08, alle ore 18:08, Massimo A. ha scritto:

---

<div class="post-metadata">

**Author:** ![arnaudo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7ba0ec/32.png) [@arnaudo](https://www.ruby-forum.com/u/arnaudo)\
**Post date:** [October 16, 2008, 11:09am UTC](https://www.ruby-forum.com/t/espressioni-regolari-gsub/150997/3 "2008-10-16T11:09:32Z")

</div>

Fabrizio R. wrote:

> Se ho capito hai delle date in un file tipo “31/12/2002”.  
> posto d = “31/12/2002”, allora…
> 
> se devi semplicemente togliere lo slash:  
> d.gsub("/","")
> 
> se devi trasformarla in “aaaa-mm-gg”:  
> d.split(///).reverse.join("-")
> 
> O devi controllare che sia una data valida?

Ciao Fabrizio,  
grazie per la risposta.

Il mio problema Ã¨ semplicemente togliere lo slash all’interno del file,  
ma solo nelle stringhe che contengono una data nel formato aaaa-mm-gg e  
renderle aaaammgg.

File.open(p+f).each\_line do | line |  
puts line  
output \<\< line.gsub(/: /, ‘’  
).gsub(/\PROID/,‘PRDID’).gsub(/[0-9]/[0-9]/,"")

file\_new = ‘C:\Documents and Settings\Massimo  
Arnaudo\Documenti\WM\_Massimo\_Arn1 My  
Documents\HanDBase\ICS\’+f+extension  
file\_new\_ics = File.new(file\_new, ‘w+’)  
file\_new\_ics.puts(output)  
file\_new\_ics.close  
end

Nel modo attuale, viene troncata la data, lasciando solamente l’anno.

Posso chiederti un ulteriore suggerimento?

Massimo

---

<div class="post-metadata">

**Author:** ![arnaudo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7ba0ec/32.png) [@arnaudo](https://www.ruby-forum.com/u/arnaudo)\
**Post date:** [October 17, 2008, 7:49am UTC](https://www.ruby-forum.com/t/espressioni-regolari-gsub/150997/4 "2008-10-17T07:49:54Z")

</div>

ciao,

a = “ciao, oggi è il 2008/10/17 (venerdì 17!)”

puts a.gsub /([0-9]{4})/([0-9]{2})/([0-9]{2})/, ‘\1\2\3’  
-\> ciao, oggi è il 20081017 (venerdì 17!)

o, se preferisci:

puts b.gsub /(\d{4})/(\d{2})/(\d{2})/, ‘\1\2\3’

---

<div class="post-metadata">

**Author:** ![arnaudo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7ba0ec/32.png) [@arnaudo](https://www.ruby-forum.com/u/arnaudo)\
**Post date:** [October 18, 2008, 6:51pm UTC](https://www.ruby-forum.com/t/espressioni-regolari-gsub/150997/5 "2008-10-18T18:51:59Z")

</div>

Pietro G. wrote:

> ciao,
> 
> a = “ciao, oggi ï¿½ il 2008/10/17 (venerdï¿½ 17!)”
> 
> puts a.gsub /([0-9]{4})/([0-9]{2})/([0-9]{2})/, ‘\1\2\3’  
> -\> ciao, oggi ï¿½ il 20081017 (venerdï¿½ 17!)
> 
> o, se preferisci:
> 
> puts b.gsub /(\d{4})/(\d{2})/(\d{2})/, ‘\1\2\3’

Perfetto.

il mio dubbio sulla modalitÃ con cui hai risolto perÃ² mi rimane, sia per  
come hai interpreatato il blocco delle cifre, sia per quanto riguarda la  
sostituzione (\1\2\3): queste informazioni come le hai apprese? Hai da  
segnalarmi in link al riguardo?

Grazie  
Massimo

---

<div class="post-metadata">

**Author:** ![arnaudo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/7ba0ec/32.png) [@arnaudo](https://www.ruby-forum.com/u/arnaudo)\
**Post date:** [October 30, 2008, 9:56am UTC](https://www.ruby-forum.com/t/espressioni-regolari-gsub/150997/6 "2008-10-30T09:56:59Z")

</div>

Direi:

- [class String - RDoc Documentation](http://ruby-doc.org/core/classes/String.html)

ma anche:

- ri String#gsub

Cito:

str.gsub(pattern, replacement) =\> new\_str

If a string is used as the replacement, special variables from the  
match (such as $& and $1) cannot be substituted into it, as  
substitution into the string occurs before the pattern match starts.  
However, the sequences \1, \2, and so on may be used to interpolate  
successive groups in the match.

comunque quegli \1, \2, … fanno molto Perl … 🙂

Un altro modo (+ o - dal libro di Matz: the ruby programming language) :

a = “ciao, oggi il 2008/10/17 (venerdi 17!)”  
pattern = /([0-9]{4})/([0-9]{2})/([0-9]{2})/  
pattern =~ a #pattern matching here

Ora, possiamo recuperare l’ultimo match con last\_match:

data = Regexp.last\_match  
p data  
#\<MatchData “2008/10/17” 1:“2008” 2:“10” 3:“17”\>

In pratica l’oggetto contiene l’ultimo match, se abbiamo creato delle  
subexpressions tra parantesi, l’oggetto MatchData contiene ogni  
subexpression.

p data.captures  
[“2008”, “10”, “17”]

METODI di LAST MATCH:

p data.methods - Object.methods # questo trucchetto mi piace un  
sacco! restituisce i metodi specifici di data…

[“string”, “end”, “values\_at”, “captures”, “size”, “pre\_match”,  
“offset”, “post\_match”, “select”, “length”, “begin”, “[]”]

… scusate il delirio , un altro caffe e mi sveglio …

tuk

Il giorno 18/ott/08, alle ore 18:51, Massimo A. ha scritto:
