Заменить 2 строки одновременно? - PullRequest
8 голосов
/ 07 февраля 2009

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

str1 = "AAAA BBBB CCCC DDDD"

Я хочу заменить каждое «AAAA» на «CCCC» и каждый «CCCC» на «AAAA», но если бы я это сделал:

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

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

что я хочу, чтобы str1 был " CCCC BBBB AAAA DDDD"

Ответы [ 3 ]

14 голосов
/ 07 февраля 2009

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

изменить , чтобы устранить путаницу

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

edit Я тоже подумал о более элегантном способе:)

str1.gsub(/((AAAA)|(CCCC))/) { $2 ? 'CCCC' : 'AAAA' }
0 голосов
/ 07 февраля 2009

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

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 
0 голосов
/ 07 февраля 2009

Можно ли сначала заменить AAAA чем-то другим, а затем продолжить?

str1.gsub("AAAA","WXYZ") # WXYZ BBBB CCCC DDDD
str1.gsub("CCCC","AAAA") # WXYZ BBBB AAAA DDDD
str1.gsub("WXYZ","CCCC") # CCCC BBBB AAAA DDDD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...