Regexp.escape
的反义词是什么?
> Regexp.escape('A & B')
=> "A\\ &\\ B"
> # do something, to get the next result: (something like Regexp.unescape(A\\ &\\ B))
=> "A & B"
如何获取原始值?
最佳答案
replaces = Hash.new { |hash,key| key } # simple trick to return key if there is no value in hash
replaces['t'] = "\t"
replaces['n'] = "\n"
replaces['r'] = "\r"
replaces['f'] = "\f"
replaces['v'] = "\v"
rx = Regexp.escape('A & B')
str = rx.gsub(/\\(.)/){ replaces[$1] }
还要确保 #puts
在 irb 中输出,因为 #inspect
默认会转义字符。
基本上转义/引用查找元字符,并在前面加上 \
字符(在源代码中必须对字符串解释进行转义)。但是,如果我们从列表中找到任何控制字符:\t
、\n
、\r
、\f
, \v
,然后引用输出 \
字符后跟这个翻译成 ascii 的特殊字符。
更新:
我的解决方案存在特殊字符问题(\n、\t ans 等等),我在调查了 rb_reg_quote method 的源代码后更新了它.
更新 2:
replaces
是哈希,它将转义字符(这就是为什么它用于附加到 gsub
的 block 中)转换为未转义的字符。它由没有转义字符(序列中的第二个字符)的字符索引并搜索未转义的值。唯一定义的值是控制字符,但还附加了 default_proc
(附加到 Hash.new
的 block ),如果在哈希中找不到值,它会返回键。所以它是这样工作的:
- 对于
"n"
它返回"\n"
,对于所有其他转义控制字符也是如此,因为它是与键关联的值 - 对于
"("
它返回"("
,因为没有与"("
键关联的值,散列调用#default_proc
,返回 key 本身
Regexp.escape
转义的唯一字符是元字符和控制字符,因此我们不必担心字母数字。
看看http://ruby-doc.org/core-2.0.0/Hash.html#method-i-default_proc关于#defoul_proc
关于ruby - Regexp.escape 的反义词是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19091025/