Я новичок в рубине, и я нашел проблему, я хотел бы знать, есть ли более «рубиновый» способ ее решения.
Моя проблема: у меня есть строка, например:
str = "<div class=\"yui-u first\">\r\n\t\t\t\t\t<h1>Jonathan Doe</h1>\r\n
\t\t\t\t\t<h2>Web Designer, Director</h2>\r\n\t\t\t\t</div>"
# now, i want to replace the substring in <h1> </h1> and <h2> and </h2> with
these two string:"fooo" and "barr".
вот что я сделал:
# first, i got the exactly matched substrings of str:
r = str.scan(/(?<=<h\d>).*?(?=<\/h\d>)/)
# then, i create a hash table to set the corresponding replace strings
h = {r[0] => 'fooo', r[1] => 'barr'}
# finally, using str.gsub to replace those matched strings
str.gsub!(/(?<=<h\d>).*?(?=<\/h\d>)/, h)
# or like this
str.gsub!(/(?<=<h\d>).*?(?=<\/h\d>)/) {|v| h[v]}
PS: подстрока в <h1> </h1>
и <h2> </h2>
не фиксирована, поэтому я должен получить эти строки ПЕРВЫМ, так чточто я могу построить хэш-таблицу.Но мне действительно не нравится приведенный выше код (потому что я написал две строки почти одинаково), я думаю, что должен быть элегантный способ сделать это.я пробовал что-то вроде этого:
str.gsub!(/(?<=<h\d>).*?(?=<\/h\d>)/) { ['fooo', 'barr'].each {|v| v}}
но это не сработало.потому что этот блок возвращает ['fooo', 'barr'] ВСЁ!если есть способ позволить этому блоку (или чему-то еще?) возвращать по одному элементу за раз (вернуть 'fooo' в первый раз, а затем вернуть 'barr' во второй), моя проблема будет решена!спасибо!