Ruby:字符串“sub”在存在“sub”时的无法解释的行为\\'&引用;

Ruby:字符串“sub”在存在“sub”时的无法解释的行为\\'&引用;,ruby,Ruby,我不明白为什么会发生这种情况: irb(main):015:0> s = "Hello\\'World" => "Hello\\'World" irb(main):016:0> "#X#".sub("X",s) => "#Hello#World#" 我本以为输出会是“Hello'World”,但我确实不明白额外的是从哪里来的 我想我不熟悉字符串sub的内部结构和“\”符号。这是因为在替换字符串中使用了反斜杠 替换字符串包含\',该字符串扩展为全局变量$”,即POSTMA

我不明白为什么会发生这种情况:

irb(main):015:0> s = "Hello\\'World"
=> "Hello\\'World"
irb(main):016:0> "#X#".sub("X",s)
=> "#Hello#World#"
我本以为输出会是“Hello'World”,但我确实不明白额外的是从哪里来的


我想我不熟悉字符串sub的内部结构和“\”符号。

这是因为在替换字符串中使用了反斜杠

替换字符串包含
\'
,该字符串扩展为全局变量
$”
,即
POSTMATCH
。对于字符串替换,它包含匹配文本后字符串中存在的所有内容。因此,因为替换的
X
后面跟着一个
#
,这就是插入的内容

比较:

"#X$".sub("X",s)
=> "#Hello$World$"
请注意,的文档涉及到反向引用的使用
\0
\9
。这似乎直接指全局变量
$0
$9
,也适用于其他全局变量

供参考,正则表达式匹配设置为:

$~ 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.

我不明白发生了什么事。。你能告诉我
$”的故事吗?为什么块形式没有发生同样的情况?@ArupRakshit-查看我答案中的链接,但基本上,当您匹配正则表达式时,Ruby会设置一些全局变量。其中一个是
$”
@Gareth Ok..但是我们这里没有使用任何正则表达式,只有一个字符串。。那怎么办?为什么不使用块形式?“如果替换为字符串,它将替换匹配的文本。它可能包含对格式为“\d”的模式捕获组的反向引用,其中d是组号或“\k”,其中n是组名。如果是双引号字符串,则两个反向引用前面必须加上一个反斜杠。但是,在替换中,特殊匹配变量(如&$)将不会引用当前匹配。”