如何在字符串中使用转义字符

时间:2011-12-18 20:14:18

标签: ruby string

我一直在研究Ruby Koans,并对“escape子句和单引号字符串”示例感到困惑。

一个例子表明我不能以这种方式真正使用转义字符,但紧接着,给出了以下示例:

def test_single_quotes_sometimes_interpret_escape_characters
  string = '\\\''
  assert_equal 2, string.size # <-- my answer is correct according to the program
  assert_equal "\\'", string  # <-- my answer is correct according to the program
end

这让我在两个方面感到困惑:

  1. 单引号有时可以与转义字符一起使用。
  2. 2assert_equal时,为什么字符串大小为"\\\'"? (我个人认为答案是"\'",这对于大小来说更有意义。)

2 个答案:

答案 0 :(得分:11)

您可以将string分成两部分来澄清事情:

string = '\\' + '\''

每个部分都是长度为1的字符串; '\\'是单个字符\'\''是单个字符'。当你把它们放在一起时,你得到两个字符串\'

在单个引用的字符串文字中有两个特殊字符:反斜杠和单引号本身。当然,单引号字符用于分隔字符串,因此您需要一些特殊的东西来将单引号转换为单引号字符串,特殊的是反斜杠,因此'\''是单引号字符串文字,表示包含一个单引号字符的字符串。类似地,如果您需要在单个带引号的字符串文字中获得反斜杠,则使用另一个反斜杠将其转义,因此'\\'的长度为1且包含一个反斜杠。

单引号字符在双引号字符串文字中没有特殊含义,因此您可以毫无困难地说{{​​1}}。但是,反斜杠在双引号字符串中确实有特殊含义,因此您必须说"'"才能在双引号字符串中添加一个反斜杠。

考虑你的猜测"\\"。单引号在双引号字符串中没有特殊含义,并且转义不需要转义的内容只会为您提供某些内容;因此,如果"\'"是一个不需要在双引号字符串中转义的字符,那么c将只是\c。特别是,c计算为"\'"(即双引号字符串中的一个单引号)。

结果是:

  • "'"
  • '\\\'' == "\\'"
  • "\\\"" == '\\"'
  • "\'" == '\''
  • "\'" == "'"
  • '\\\''.length == 2
  • "\\\"".length == 2
  • "\'".length == 1

卡西姆给出的Wikibooks reference涵盖了这些事情。

当我需要将引号引入字符串时,我通常会切换到%q{} (similar to single quoting) or %Q{} (similar to double quoting),所有反斜杠都会让我的眼睛流血。

答案 1 :(得分:0)

这可能值得一读:http://en.wikibooks.org/wiki/Ruby_Programming/Strings

ruby-1.9.3-p0 :002 > a = '\\\''
 => "\\'" 
ruby-1.9.3-p0 :003 > a.size
 => 2 
ruby-1.9.3-p0 :004 > puts a
\'

在单引号中只有两个转义字符:\\\'