Как заменить обратную косую черту двойным обратным слэшем?
Я пытаюсь заменить обратную косую черту в моей строке двумя обратными косыми чертами:
str.gsub!("\\", "\\\\")
Но он ничего не делает. Я в замешательстве...
Ответ 1
Обратите внимание, что этот ответ был представлен в контексте Ruby 1.9. Как рубин 2.0 имеет новый механизм регулярных выражений, он может быть недействительным в этом контексте.
Это работает:
str.gsub!("\\", "\\\\\\")
str.gsub!("\\", "\\\\\\\\") # also, will always work
Отказ от ответственности: я не знаком с внутренними работами рубинового двигателя, любая информация здесь вычитается из упомянутой выше статьи.
Основная вещь, которую нужно знать, состоит в том, что строка замены получает оценку 2 раза.
В первый раз, когда косые черты выполняют свою работу как escape-последовательности в строке, во второй раз gsub будет искать строку для ссылок на группы.
как упоминалось @chris-johnsen, 6 слэшей не работают. Это заставляет меня поверить, что такое происходит:
Для 6 косой черты. 3 слэша передаются на опорный слой группы. Конечная косая черта интерпретируется не как escape-символ, потому что после нее ничего не происходит, она интерпретируется как обратная косая черта. Итак, наконец, этот слой возвращает 2 слэша. Если что-то будет тянуть его, выражение будет терпеть неудачу, так как третий слэш теперь будет работать как escape-символ.
Для 8 косой черты: 4 косая черта передается на опорный слой группы. Четыре слэша, в свою очередь, будут уменьшены до двух.