ruby - Regexp.escape 的反义词是什么?

标签 ruby regex

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 ),如果在哈希中找不到值,它会返回键。所以它是这样工作的:

  1. 对于 "n" 它返回 "\n",对于所有其他转义控制字符也是如此,因为它是与键关联的值
  2. 对于 "(" 它返回 "(",因为没有与 "(" 键关联的值,散列调用 #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/

相关文章:

ruby - 如何使用 Ruby 打印雪人

ruby - JetBrains RubyMine 3.2.4 调试器不工作

c# - 替换文本中的非字母数字字符

python - 使用 Python 在文本中查找超链接(twitter 相关)

regex - 保留 PERL REGEX 中的浮点值以进行计算

ruby-on-rails - 用于验证目的的动态查找器方法

ruby - 如何使用 SSL version = TLS 编写 POST 请求,我得到 SSL_connect SYSCALL returned=5 errno=0

javascript - 使用 RegExp 查找 JSON 中的对象

regex - 将正则表达式放在变量中

ruby 应用程序在 heroku 上崩溃 : Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch