我不明白为什么会这样:
irb(main):015:0> s = "Hello\\'World"
=> "Hello\\'World"
irb(main):016:0> "#X#".sub("X",s)
=> "#Hello#World#"
我原以为输出会是“#Hello\'World#”,我当然无法理解额外的 # 是从哪里来的。
我想我不熟悉与 String#sub 的内部结构和“\'”符号有关的东西。
我不明白为什么会这样:
irb(main):015:0> s = "Hello\\'World"
=> "Hello\\'World"
irb(main):016:0> "#X#".sub("X",s)
=> "#Hello#World#"
我原以为输出会是“#Hello\'World#”,我当然无法理解额外的 # 是从哪里来的。
我想我不熟悉与 String#sub 的内部结构和“\'”符号有关的东西。
这是由于在sub
替换字符串中使用了反斜杠。
您的替换字符串包含\'
扩展为全局变量$'
,也称为 POSTMATCH
. 对于字符串替换,它包含匹配文本之后存在的字符串中的所有内容。所以因为X
你替换的后面跟着一个#
,这就是插入的内容。
比较:
"#X$".sub("X",s)
=> "#Hello$World$"
请注意, 的文档是sub
指\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.