Подтвердить что ты не робот

Как заменить обратную косую черту двойным обратным слэшем?

Я пытаюсь заменить обратную косую черту в моей строке двумя обратными косыми чертами:

str.gsub!("\\", "\\\\")

Но он ничего не делает. Я в замешательстве...

4b9b3361

Ответ 1

Обратите внимание, что этот ответ был представлен в контексте Ruby 1.9. Как рубин 2.0 имеет новый механизм регулярных выражений, он может быть недействительным в этом контексте.

Это работает:

str.gsub!("\\", "\\\\\\") 
str.gsub!("\\", "\\\\\\\\") # also, will always work

Изменить: Объяснение (через http://www.ruby-forum.com/topic/143645, предоставленное @vache)

Отказ от ответственности: я не знаком с внутренними работами рубинового двигателя, любая информация здесь вычитается из упомянутой выше статьи.

Основная вещь, которую нужно знать, состоит в том, что строка замены получает оценку 2 раза.

В первый раз, когда косые черты выполняют свою работу как escape-последовательности в строке, во второй раз gsub будет искать строку для ссылок на группы.

как упоминалось @chris-johnsen, 6 слэшей не работают. Это заставляет меня поверить, что такое происходит:

Для 6 косой черты. 3 слэша передаются на опорный слой группы. Конечная косая черта интерпретируется не как escape-символ, потому что после нее ничего не происходит, она интерпретируется как обратная косая черта. Итак, наконец, этот слой возвращает 2 слэша. Если что-то будет тянуть его, выражение будет терпеть неудачу, так как третий слэш теперь будет работать как escape-символ.

Для 8 косой черты: 4 косая черта передается на опорный слой группы. Четыре слэша, в свою очередь, будут уменьшены до двух.