Я предлагаю сделать это в два шага для размещения более сложных строк. Я предположил, что строки «один» и «три» должны быть извлечены из следующей строки.
str = <<-_
{{one}}
<content>cats {{two}} and <content2>{{four}}</content2> dogs</content>
{{three}}
_
r0 = /
<
([^>]+) # match >= 1 characters other than '>' in capture group 1
>
.+? # match one or more characters lazily
<\/ # match '<' then forward slash
\1 # match the contents of capture group 1
>
/x # free-spacing regex definition mode
r1 = /
(?<=\{\{) # match '{{' in a positive lookbehind
[^\}]+ # match any number of characters other than '}'
(?=\}\}) # match '}}' in a positive lookahead
/x # free-spacing regex definition mode
str.gsub(r0, '').scan(r1)
#=> ["one", "three"]
Первый шаг:
str.gsub(r0, '')
#=> "{{one}}\n\n{{three}}\n"
Это, конечно, работает, если вторая строка строки просто
"<content>{{two}}</content>\n"
Два регулярных выражения условно записываются следующим образом.
r0 = /<([^>]+)>.+?<\/\1>/
r1 = /(?<=\{\{)[^\}]+(?=\}\})/