Я пытаюсь выяснить, как заменить кавычку как '
с чем-то как \'
.
Как я сделал бы это?
Я попробовал
"'".gsub("'","\\'")
но это просто дает пустую строку. Что я делаю неправильно здесь?
Как насчет этого
puts "'".gsub("'","\\\\'")
\'
Причина в том, что \ '
означает пост-соответствие в gsub (регулярном выражении), и поэтому его нужно экранировать с помощью \ \ '
и \
, очевидно, экранируются как \\
, заканчиваясь \\\\'
.
Пример
>> "abcd".gsub("a","\\'")
=> "bcdbcd"
a
заменяется всем после a
.
Как насчет того, чтобы сделать это:
"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")
Неприятно, но я думаю, что это работает ...
Один из вариантов использует разные размеры путем закольцовывания до тех пор, пока не будет получена правильная ширина. То есть, начните с полной последовательности, если она шире необходимой, замените два последних символа многоточием. Петля, пока она не станет достаточно узкой.
Если вы думаете, что будете работать с длинными последовательностями, вы можете двоично искать свой путь к точке усечения, чтобы сделать его немного быстрее.
-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"
Я фактически использовал двухэтапный подход ...
BACKSLASH = 92.chr
temp = "'".gsub("'", "¤'")
puts temp.gsub("¤", BACKSLASH)
=> "\'"
Будет работать, только если "" явно не используется в тексте. ..
Переменная $'
- это строка справа от совпадения. В строке замены gsub
эта же переменная будет \'
- отсюда и проблема.
x = "'foo'"
x.gsub!(/'/, "\\'")
puts x.inspect # foo'foo
Это должно работать:
x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x