Заэскепить символы Ruby (gsub!)

Полчаса воюю с простой регуляркой. Нужно экранировать некоторые символы для TeX

# \ % и т.д.

sub.gsub! /([\%#])/, '\\1'

Символ процента не трогает вообще

sub.gsub! /([\%#])/, '\\\1'

Не экранирует, но убирает.

Пробовал там #{$1} и т.д. безрезультатно


Ответы (1 шт):

Автор решения: Vadik

В Ruby чтобы представить обратный слэш в строке, его нужно экранировать обратным слэшом: "\\" или '\\'. Поэтому вам просто нужно удвоить количество слэшей:

"Какая\\то% строка#".gsub(/[\\%#]/, '\\\\\\0')
# => "Какая\\\\то\\% строка\\#"

В некоторых случаях Ruby может запутать, когда вы, например, пишете '\n' это на самом деле соответствует '\\n':

'\n' == '\\n'
# => true
'\n' == "\\n"
# => true

При этом символ переноса строки это "\n", но не "\\n":

"\n" == "\\n"
# => false
→ Ссылка