Объединение строк может помочь облегчить проблему и избежать синдрома наклоняющейся зубочистки:
str = str.gsub(re, '<pre><code>\1
'
Становится:
str = str.gsub(re, "\n<pre><code>\n" + '\1' + "\n
\ n "
Вы можете увидеть, что он делает в IRB:
<code>"\n<pre><code>\n" + '\1' + "\n
\ n "=>" \ n
<code>\n\\1\n
\ n "