2010-03-27 14 views
7

Ho riscontrato un problema con l'ottenimento di una sostituzione di stringa Ruby. Sto scrivendo un preprocessore per un linguaggio limitato che sto usando, che non supporta nativamente gli array, quindi sto hackerando da solo.Sostituire tutte le corrispondenze con valori in regolare espressione Ruby

Ho una linea:

x[0] = x[1] & x[1] = x[2] 

voglio sostituire ogni istanza con una versione rivista:

x__0 = x__1 & x__1 = x__2 

La linea può includere le parentesi quadre altrove.

Ho un'espressione regolare che abbinerà l'uso matrice:

array_usage = /(\w+)\[(\d+)\]/ 

ma non riesco a capire il rubino costrutto per sostituire ogni istanza uno per uno. Non riesco a utilizzare .gsub() perché corrisponde a ogni istanza sulla linea e sostituisce ogni dichiarazione di matrice con qualunque sia la prima. .scan() si lamenta che la stringa viene modificata se si tenta di utilizzare la scansione con uno .sub()! all'interno di un blocco.

Qualsiasi idea sarebbe apprezzata!

risposta

18

Actaully è possibile utilizzare gsub, devi solo stare attenti a usare in modo corretto:

s = 'x[0] = x[1] & x[1] = x[2]' 
s.gsub!(/(\w+)\[(\d+)\]/, '\1__\2') 
puts s 

Risultato:

x__0 = x__1 & x__1 = x__2 
+0

Oh, la magia, grazie. Questo non ha funzionato per me perché ho spostato il '\ 1 __ \ 2' tra virgolette "", non singolo ''. Vado a leggere perché Ruby tratta ciascuno in modo diverso. Grazie Marco! – cflewis

+3

@Lewisham: quando si usano virgolette "\ 1" viene interpretato come codice di escape per il carattere ASCII 1. Quando si usano virgolette singole, la stringa viene interpretata letteralmente come una barra rovesciata seguita da 1, che gsub riconosce. –

+2

Puoi ancora usare le virgolette doppie se esci \ 1. per esempio. "\\ 1 __ \\ 2" – seo

Problemi correlati