【发布时间】:2011-10-28 23:14:46
【问题描述】:
假设我说£ 字符很危险,并且我希望能够保护和取消保护任何字符串。反之亦然。
示例 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 从字符串中转义(和取消转义)给定字符(例如我的示例中的 £)?
编辑:这里是关于这个问题的行为的解释。
首先,感谢您的回答。我有一个带有Tweet 模型的Rails 应用程序,该模型具有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'
完美。
现在,如果有这个:
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(/(?<!\\)(?=(?:\\\\)*£)/, "\\") 似乎不起作用。
【问题讨论】:
-
你到底想用这个做什么?
-
Ruby 1.9.2 中的字符串与 1.8.7 中的字符串工作方式非常不同,因此您可能应该指定您使用的版本。
-
@ben-alpert:我刚刚更新了我的问题,关于这种行为背后的原因。
-
你为什么不把它序列化为
["Hello ", 42, "!"]for"Hello @bob!"? -
@ben-alpert: ...哎呀,我完全正确!非常感谢你的想法。超级简单好方法!
标签: ruby regex string escaping