Как заменить обратную косую черту на двойную? - PullRequest
18 голосов
/ 02 июня 2011

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

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

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

1 Ответ

16 голосов
/ 02 июня 2011

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

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

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

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

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

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

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

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

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

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

...