Почему этот Ruby не заменяет регулярные выражения, как ожидалось? - PullRequest
2 голосов
/ 22 октября 2010

Рассмотрим следующую строку, которая является фрагментом C в файле:

strcat(errbuf,errbuftemp);

Я хочу заменить errbuf (но не errbuftemp) на префикс G-> plus errbuf. Чтобы сделать это успешно, я проверяю символ после и символ перед errbuf, чтобы увидеть, есть ли он в списке разрешенных символов, и затем выполняю замену.

Я создал следующий файл Ruby:

line = " strcat(errbuf,errbuftemp);"  
item = "errbuf"  
puts line.gsub(/([ \t\n\r(),\[\]]{1})#{item}([ \t\n\r(),\[\]]{1})/, "#{$1}G\->#{item}#{$2}")

Ожидаемый результат:

strcat(G->errbuf,errbuftemp);

Фактический результат

strcatG->errbuferrbuftemp);

По сути, совпадающие символы до и после errbuf не вставляются обратно с выражением замены.

Кто-нибудь может указать, что я делаю неправильно?

Ответы [ 2 ]

3 голосов
/ 22 октября 2010

Поскольку вы должны использовать синтаксис gsub(/.../){"...#{$1}...#{$2}..."} или gsub(/.../,'...\1...\2...').

Здесь была та же проблема: werid, то же выражение дает другое значение при двухкратном исключении в irb

Проблема в том, что переменная $ 1 интерполируется в строку аргумента перед запуском gsub, а это означает, что предыдущее значение $ 1 - это то, чем символ заменяется.Вы можете заменить второй аргумент на '\ 1?'чтобы получить желаемый эффект. (Чак)

0 голосов
/ 22 октября 2010

Я думаю, что частью проблемы является использование gsub () вместо sub ().

Вот два варианта:

str = 'strcat(errbuf,errbuftemp);'

str.sub(/\w+,/) { |s| 'G->' + s } # => "strcat(G->errbuf,errbuftemp);"
str.sub(/\((\w+)\b/, '(G->\1') # => "strcat(G->errbuf,errbuftemp);"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...