ruby中的动态转义字符

时间:2015-05-24 17:26:30

标签: ruby string

我正在使用STDIN.getch从控制台获取单个字符。我希望能够以原始形式解释转义字符,例如\n。即如果用户要键入\后跟n,我希望将它们组合起来代表\n字符,而不是\n字符串。

2 个答案:

答案 0 :(得分:1)

调整处理getch值的方法,以便根据字符做出不同的响应。

如果角色是' \',则再次使用getch并将用户输入变量设置为等效的转义字符。

如果角色不是' \'然后像你一样处理。

关于如何实际取消将这两者连接在一起的字符串,我从https://stackoverflow.com/a/20131717/2585056获得了以下代码选项

UNESCAPES = {
    'a' => "\x07", 'b' => "\x08", 't' => "\x09",
    'n' => "\x0a", 'v' => "\x0b", 'f' => "\x0c",
    'r' => "\x0d", 'e' => "\x1b", "\\\\" => "\x5c",
    "\"" => "\x22", "'" => "\x27"
}

def unescape(str)
  # Escape all the things
  str.gsub(/\\(?:([#{UNESCAPES.keys.join}])|u([\da-fA-F]{4}))|\\0?x([\da-fAF]{2})/) {
    if $1
      if $1 == '\\' then '\\' else UNESCAPES[$1] end
    elsif $2 # escape \u0000 unicode
      ["#$2".hex].pack('U*')
    elsif $3 # escape \0xff or \xff
      [$3].pack('H2')
    end
  }
end

那个有点复杂,但看起来它应该工作而不是不安全 - 其他一些选项使用eval,这将使用户能够运行他们想要的任何ruby语句:)如果它只是为了你可能没问题 - 请查看上面的链接以了解其他选项。

答案 1 :(得分:1)

通常,您只需读取反斜杠,然后尝试读取其中一个可用的转义字符(更确切地说,它的第二部分)。然后,如果匹配适当的字符,则返回所需字符(在您的情况下为“\ n”):

while(true) do
  char = STDIN.getch
  if char == "\\"
    puts "Type your espace character"
    s = STDIN.getch
    case s
      when 'n'
        puts 'New line typed'
        # but return "\n"
      when 'r'
        puts 'Carriage return typed'
        # but return "\r"
      when 't'
        puts 'Tabulation typed'
        # but return "\t"
      # ...
    end
  else
    puts "#{char} typed"
  end
end

或者您可以连接您阅读的字符,然后用适当的转义序列替换:

# assume s is a concatenated string
>> s = '123\n456'      #=> "123\\n456"
>> s.size              #=> 8
>> s.gsub!('\n', "\n") #=> "123\n456"
>> s.size              #=> 7