Замена '\' в Ruby?

Я пытаюсь выяснить, как заменить кавычку как ' с чем-то как \'.

Как я сделал бы это?

Я попробовал

"'".gsub("'","\\'")

но это просто дает пустую строку. Что я делаю неправильно здесь?

14
задан Earlz 15 February 2010 в 14:49
поделиться

5 ответов

Как насчет этого

puts "'".gsub("'","\\\\'")
\'

Причина в том, что \ ' означает пост-соответствие в gsub (регулярном выражении), и поэтому его нужно экранировать с помощью \ \ ' и \ , очевидно, экранируются как \\ , заканчиваясь \\\\' .

Пример

>> "abcd".gsub("a","\\'")
=> "bcdbcd"

a заменяется всем после a .

29
ответ дан 1 December 2019 в 08:52
поделиться

Как насчет того, чтобы сделать это:

"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")

Неприятно, но я думаю, что это работает ...

-1
ответ дан 1 December 2019 в 08:52
поделиться

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

Если вы думаете, что будете работать с длинными последовательностями, вы можете двоично искать свой путь к точке усечения, чтобы сделать его немного быстрее.

-121--4126614-

Файловая система является отличным примером того, как TDD может привести вас к лучшему, более гибкому дизайну. Часто при взаимодействии с файловой системой можно выполнять чтение и запись файлов с помощью Streams или TextWriters вместо фактических файлов.

Это все абстрактные типы, и так легко издеваться.

Теперь у вас есть более гибкий API, потому что он не тесно связан с файловой системой, но по-прежнему поддерживает операции с файлами.

-121--3329677-

Это может быть ошибка.. Или, по крайней мере, что-то, что ломает МОЕ представление о принципе наименьшего удивления.

irb(main):039:0> "life's grand".gsub "'", "\\\'"
=> "lifes grands grand"
irb(main):040:0> "life's grand".gsub "'", "\\\\'"
=> "life\\'s grand"
0
ответ дан 1 December 2019 в 08:52
поделиться

Я фактически использовал двухэтапный подход ...

BACKSLASH = 92.chr
temp = "'".gsub("'", "¤'")
puts temp.gsub("¤", BACKSLASH)
=> "\'"

Будет работать, только если "" явно не используется в тексте. ..

0
ответ дан 1 December 2019 в 08:52
поделиться

Переменная $' - это строка справа от совпадения. В строке замены gsub эта же переменная будет \' - отсюда и проблема.

x = "'foo'"
x.gsub!(/'/, "\\'")
puts x.inspect        # foo'foo

Это должно работать:

x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x
3
ответ дан 1 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: