2009-02-07 4 views
8

Как я могу заменить 2 строки в одно и то же время? например, скажем, у меня есть строка, как это:Заменить 2 строки одновременно?

str1 = «АААА BBBB КПКГ DDDD»

я хочу, чтобы заменить все «AAAA» с «КЦИКОМ» и каждый «КЦИКОМ» с «AAAA», но если я сделал:

str1.gsub ("АААА", "КПКГ") # КПКГ BBBB КПКГ DDDD

str1.gsub ("КПКГ", "AAAA") # AAAA BBBB AAAA DDDD

что я хочу str1 быть «КПКГ BBBB AAAA DDDD»

ответ

14

Общий ответ:
Используйте регулярное выражение, чтобы соответствовать как AAAA и КПКГ, а затем заменить каждый матч с КЦИК и AAAA соответственно.

редактировать прояснить путаницу

str1.gsub(/(AAAA|CCCC)/) { $1 == 'AAAA' ? 'CCCC' : 'AAAA' } 

редактировать я думал о более элегантный способ тоже :)

str1.gsub(/((AAAA)|(CCCC))/) { $2 ? 'CCCC' : 'AAAA' } 
+0

Согласитесь, это похоже на гораздо лучшее решение, чем другие предложения. Я не могу понять, что такое регулярное выражение. –

+0

Просто используйте оператор чередования: AAAA | CCCC – Morendil

+0

Согласованный Morendil, но как выглядит синтаксис замены? Вам нужно поместить свои находки в группы, такие как: (AAAA) | (CCCC) И затем сделайте какую-то хитрость в замене на \ 1 и \ 2. –

0

Является ли это вариант для вас, чтобы заменить AAAA с чем-то else сначала, а затем продолжить?

str1.gsub("AAAA","WXYZ") # WXYZ BBBB CCCC DDDD 
str1.gsub("CCCC","AAAA") # WXYZ BBBB AAAA DDDD 
str1.gsub("WXYZ","CCCC") # CCCC BBBB AAAA DDDD 
+0

Просто позаботьтесь о выборе временной строки для замены AAAA, она не должна существовать в исходной строке. – alexandrul

+0

Не знаю, почему было -1 ... Технически, регулярное выражение (как язык) не имеет памяти. то есть принятое решение выше не должно работать. Александрус уже указал на ловушку. регулярное выражение как инструмент может делать то, что принятое решение делает ... – Calyth

+0

«не должно работать»? хм – 2009-02-11 06:16:24

0

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

str1 = "AAAA BBBB CCCC DDDD"  
replacements = { "AAAA" => "CCCC", "CCCC" => "AAAA", "XXXX" => "ZZZZ" } # etc... 

new_string = "" 
str1.split(" ").each do |s| 
    new_string += replacements[s] || s 
    new_string += " " 
end 

puts new_string # CCCC BBBB AAAA DDDD 

 Смежные вопросы

  • Нет связанных вопросов^_^