Предположим, я сказал £
символ как опасный, и я хочу иметь возможность защищать и снимать защиту с любой строки. И наоборот.
Пример 1:
"Foobar £ foobar foobar foobar." # => dangerous string
"Foobar \£ foobar foobar foobar." # => protected string
Пример 2:
"Foobar £ foobar £££££££foobar foobar." # => dangerous string
"Foobar \£ foobar \£\£\£\£\£\£\£foobar foobar." # => protected string
Пример 3:
"Foobar \£ foobar \\£££££££foobar foobar." # => dangerous string
"Foobar \£ foobar \\\£\£\£\£\£\£\£foobar foobar." # => protected string
Есть ли простой способ, с помощью Ruby, экранировать (и не удалять) данный символ (например, £
в моем примере) из строки?
Редактировать: вот объяснение поведения этого вопроса.
Прежде всего, спасибо за ваши ответы. У меня есть приложение Rails с моделью Tweet
, имеющей поле content
. Пример твита:
tweet = Tweet.create(content: "Hello @bob")
Внутри модели есть процесс сериализации, который преобразует строку следующим образом:
dump('Hello @bob') # => '["Hello £", 42]'
# ... where 42 is the id of bob username
Затем я могу десериализовать и отобразить его твит следующим образом:
load('["Hello £", 42]') # => 'Hello @bob'
Таким же образом, это также возможно сделать с более чем одним именем пользователя:
dump('Hello @bob and @joe!') # => '["Hello £ and £!", 42, 185]'
load('["Hello £ and £!", 42, 185]') # => 'Hello @bob and @joe!'
Это цель:)
Но этот поиск и замену может быть трудно выполнить с чем-то вроде:
tweet = Tweet.create(content: "£ Hello @bob")
потому что здесь мы также должны сбежать £
char. И я думаю, что ваше решение хорошо для этого. Итак, результатом станет:
dump('£ Hello @bob') # => '["\£ Hello £", 42]'
load('["\£ Hello £", 42]') # => '£ Hello @bob'
Просто отлично. <3 <3 </p>
Теперь, если есть это:
tweet = Tweet.create(content: "\£ Hello @bob")
Я думаю, что сначала мы должны сбежать через каждые \
, а затем через каждые £
, например:
dump('\£ Hello @bob') # => '["\\£ Hello £", 42]'
load('["\\£ Hello £", 42]') # => '£ Hello @bob'
Однако ... как мы можем сделать в этом случае:
tweet = Tweet.create(content: "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\£ Hello @bob")
... где tweet.content.gsub(/(?<!\\)(?=(?:\\\\)*£)/, "\\")
не работает.