2010-03-27 14 views
7

Mam problem z uruchomieniem zamiany ciągów znaków Ruby. Piszę preprocesor na ograniczony język, którego używam, który natywnie nie obsługuje tablic, więc włamuję się sam.Zastąp wszystkie dopasowania wartościami w regularnym wyrażeniu Ruby

Mam wiersz:

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

chcę zastąpić każde wystąpienie z wersją przeformatowanym:

x__0 = x__1 & x__1 = x__2 

Linia może zawierać nawiasów kwadratowych gdzie indziej.

Mam regex, który będzie pasował do wykorzystania tablicy:

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

ale nie mogę dowiedzieć się Ruby skonstruować zastąpić każde wystąpienie jednego po drugim. Nie mogę użyć .gsub(), ponieważ będzie to pasować do każdego wystąpienia na linii i zastąpić każdą deklarację tablicy tym, czym była pierwsza. .scan() narzeka, że ​​ciąg znaków jest modyfikowany, jeśli spróbujesz użyć skanowania z numerem .sub()! w bloku.

Wszelkie pomysły będą mile widziane!

Odpowiedz

18

actaully można użyć gsub, po prostu trzeba być ostrożnym, aby go używać prawidłowo:

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

Wynik:

x__0 = x__1 & x__1 = x__2 
+0

Och, magia, dziękuję. Nie działało to dla mnie, ponieważ opakowałem "\ 1 __ \ 2" w podwójne cudzysłowy "", a nie pojedyncze "". Pójdę i przeczytam, dlaczego Ruby traktuje każdą z nich inaczej. Dzięki Mark! – cflewis

+3

@Lewisham: Gdy używasz podwójnych cudzysłowów "\ 1" jest interpretowane jako kod ucieczki dla znaku ASCII 1. Kiedy używasz pojedynczych cudzysłowów, ciąg znaków jest interpretowany dosłownie jako ukośnik odwrotny, a następnie 1, który gsub rozpoznaje. –

+2

Możesz nadal używać podwójnych cudzysłowów, jeśli wyjdziesz z \ 1. na przykład "\\ 1 __ \\ 2" – seo

Powiązane problemy