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これは、置換文字列にバックスラッシュが使用されているためです。

置換文字列には、 として知られて\'いるグローバル変数に展開されるものが含まれています。文字列置換の場合、一致したテキストの後に存在する文字列内のすべてが含まれます。そのため、置き換えた yourの後に a が続くため、それが挿入されます。$' POSTMATCHX#

比較:

"#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 に答える