Ruby:存在“\\”时String#sub的无法解释的行为

时间:2013-10-17 14:17:07

标签: ruby

我无法理解为什么会发生这种情况:

irb(main):015:0> s = "Hello\\'World"
=> "Hello\\'World"
irb(main):016:0> "#X#".sub("X",s)
=> "#Hello#World#"

我原以为输出会是“#Hello \'World#”,我当然无法理解额外的#来自哪里。

我想我不熟悉与String#sub的内部和“\”符号有关的内容。

1 个答案:

答案 0 :(得分:4)

这是由于在sub替换字符串中使用了反斜杠。

您的替换字符串包含\',该字符串已扩展为全局变量$' otherwise known as POSTMATCH。对于字符串替换,它包含匹配文本后面的字符串中的所有内容。因为您替换的X后面跟着#,这就是插入的内容。

比较

"#X$".sub("X",s)
=> "#Hello$World$"

请注意,sub的文档指的是使用反向引用\0\9。这似乎直接引用全局变量$0$9,也适用于其他全局变量。

作为参考,正则表达式匹配设置的other global variables为:

$~ is equivalent to ::last_match;

$& contains the complete matched text;

$` contains string before match;

$' contains string after match;

$1, $2 and so on contain text matching first, second, etc capture group;

$+ contains last capture group.