String#gsub, как использовать совпадение в атрибуте replace, а также вставлять линию разрыва

С помощью String#gsub я могу вставить строки разрыва в атрибут replace:

"my string".gsub(/\s/, "\n") #=> "my\nstring"

Но если я также хочу использовать часть совпадения регулярного выражения в атрибуте replace, я буду вынужден использовать одинарные квоты ('). И тогда я не знаю, как вставить разрывную линию.

Я пробовал:

> "my string".gsub!(/(my )/, '\1\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\\\n')
=> "my \\\\nstring"
> "my string".gsub!(/(my )/, '\1\\\\\n')
=> "my \\\\nstring"

Ничего не работает.

🤔 А знаете ли вы, что...
Ruby предоставляет инструменты для создания RESTful веб-сервисов.


50
2

Ответы:

Решено

Вам не нужно использовать одинарные кавычки. Просто используйте двойные кавычки и замените \1 на \\1:

irb> "my string".gsub(/(my )/, "\\1\n")
=> "my \nstring"

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

irb> '\1' == "\\1"
=> true
irb> '\n' == "\\n"
=> true

Вы можете использовать несколько стилей кавычек одновременно. Хотя это используется редко, в Ruby вы можете смешивать и сопоставлять строковые литералы с разными стилями кавычек.

Из документации:

Любая комбинация соседних строк с одинарными, двойными кавычками и процентами будет объединяться, если строка с процентами не является последней.

Применительно к вашей проблеме:

"my string".gsub(/(my )/, '\1' "\n")
#=> "my \nstring"

В приведенном выше коде '\1' "\n" представляет один экземпляр строки. Вы также можете вставить эти объединенные литералы в IRB, и он вернет эквивалент строкового литерала в двойных кавычках:

'\1' "\n"
#=> "\\1\n"

Что, в свою очередь, вы можете использовать в своем коде:

"my string".gsub(/(my )/, "\\1\n")
#=> "my \nstring"