Заменить все совпадения значениями в регулярном выражении Ruby - PullRequest
7 голосов
/ 28 марта 2010

У меня проблема с выполнением подстановки строк в Ruby. Я пишу препроцессор для ограниченного языка, который я использую, который изначально не поддерживает массивы, поэтому я хакерский самостоятельно.

У меня есть строка:

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

Я хочу заменить каждый экземпляр переформатированной версией:

x__0 = x__1 & x__1 = x__2

Строка может содержать квадратные скобки в другом месте.

У меня есть регулярное выражение, которое будет соответствовать использованию массива:

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

но я не могу понять конструкцию Ruby для замены каждого экземпляра по одному. Я не могу использовать .gsub(), потому что это будет соответствовать каждому экземпляру в строке и заменять каждое объявление массива тем, что было первым. .scan() жалуется, что строка изменяется, если вы пытаетесь использовать сканирование с .sub()! внутри блока.

Любые идеи будут оценены!

1 Ответ

18 голосов
/ 28 марта 2010

На самом деле вы можете использовать gsub , вам просто нужно быть осторожным, чтобы использовать его правильно:

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

Результат:

x__0 = x__1 & x__1 = x__2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...