在Ruby中转义字符串

我想在一些Ruby中插入以下内容作为变量的值:

`~!@#$%^&*()_-+={}|[]\:";'?,./ 

用双引号括起来这不行,所以有一个很好的escape_until_the_end可用的东西吗?

不要使用多种方法 – 保持简单。

逃避#,反斜杠和双引号。

 irb(main):001:0> foo = "`~!@\#$%^&*()_-+={}|[]\\:\";'<>?,./" => "`~!@\#$%^&*()_-+={}|[]\\:\";'<>?,./" 

或者,如果您不想转义#(双引号字符串中变量的替换字符),请使用和转义单引号:

 irb(main):002:0> foo = '`~!@#$%^&*()_-+={}|[]\\:";\'<>?,./' => "`~!@\#$%^&*()_-+={}|[]\\:\";'<>?,./" 

%q非常适用于许多其他不包含每个ascii标点字符的字符串。 🙂

 %q(text without parens) %q{text without braces} %Q[text without brackets with #{foo} substitution] 

编辑:显然你也可以在%q()内成功使用平衡的parens,但我认为从维护的角度来看这有点危险,因为那里没有语义意味着你总是必须在字符串中平衡你的parens 。

首先,除非我疯了, %q() 这里工作得非常好,因为内括号是平衡的:

 >> weird = %q(`~!@#$%^&*()_-+={}|[]\:";'<>?,./) => "`~!@\#$%^&*()_-+={}|[]\\:";'<>?,./" >> puts weird `~!@#$%^&*()_-+={}|[]\:";'<>?,./ 

作为旁注:当使用%q ,您总是使用空格作为分隔符的核选项。 这是犯规 ,正式是一个坏主意,但它的确有效。

再说一遍,我不会这样做,只是为了看…

 >> weird = %q `~!@#$%^&*()_-+={}|[]\:";'<>?,./ => "`~!@\#$%^&*()_-+={}|[]\\:";'<>?,./" 

<%q{}是你的朋友。 有关使用Programming Ruby The Pragmatic Programmer's Guide的信息 。

尝试混合各种方法:

 %q{`~!@#$%^&*()_-+}+"{}"+%q{=|[]\\:";'<>?,./} 

或者,只需使用反斜杠来逃避有问题的字符:

 "`~!@\#$%^&*()_-+{}=|[]\\:\";'<>?,./" 

我通常会想到的第一件事就是%q指令 – 但是因为你似乎使用了通常用于划分一个标点符号的所有标点符号,所以我想不出一个简单的方法可以让它在这里工作。

我想到的第二件事是heredoc:

 mystring = <?,./ END 

但是,在反斜杠之后,这会打破。

所以我的第三个答案,笨重但是我能想到的最好的事情,只需要两分钟的思考,就是用“无法解释”的“问题”字符代替它,然后在作业后用它代替:

 mystring = '`~!@#$%^&*()_-+={}|[]\:"; <>?,./'.tr(" ","'") 

我不喜欢它,但它有效。