3

我不明白为什么会这样:

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

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

我想我不熟悉与 String#sub 的内部结构和“\'”符号有关的东西。

4

1 回答 1

4

这是由于在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.
于 2013-10-17T14:36:45.017 回答