在Ruby中转义字符串

时间:2009-10-27 23:40:18

标签: ruby

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

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

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

4 个答案:

答案 0 :(得分:13)

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

转义#,反斜杠和双引号。

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在一个字符串中。

答案 1 :(得分:8)

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

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

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

同样,我不会这样做,只是为了看......

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

答案 2 :(得分:2)

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

的信息

尝试混合各种方法:

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

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

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

答案 3 :(得分:0)

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

我想到的第二件事是heredoc:

mystring = <<END
`~!@#$%^&*()_-+={}|[]\:";'<>?,./
END
但是,在反斜杠之后,这会打破。

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

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

我不喜欢它,但它有效。