Espressioni regolari: gsub

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

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:

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

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’

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

Direi:

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

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: