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