我无法理解为什么会发生这种情况:
irb(main):015:0> s = "Hello\\'World"
=> "Hello\\'World"
irb(main):016:0> "#X#".sub("X",s)
=> "#Hello#World#"
我原以为输出会是“#Hello \'World#”,我当然无法理解额外的#来自哪里。
我想我不熟悉与String#sub的内部和“\”符号有关的内容。
答案 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.