奇怪的是,当在irb中执行两次时,相同的表达式产生不同的值

时间:2010-09-30 09:16:28

标签: ruby regex

irb(main):051:0> "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,"#{$1} ?")  
=> "ts_id > ?"
irb(main):052:0> "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,"#{$1} ?")
=> "ts_id < ?"

任何人都可以启发我吗?

2 个答案:

答案 0 :(得分:5)

问题是变量$1在运行 gsub之前插入到参数字符串中,这意味着之前的值{ {1}}是符号被替换的内容。您可以用$1替换第二个参数以获得预期的效果。

答案 1 :(得分:2)

irb(main):001:0>  "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,"#{$1} ?")
=> "ts_id  ?"
irb(main):002:0>  "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,"#{$1} ?")
=> "ts_id < ?"

请注意,我使用了新的已启动的irb,其中$1nil。这一切都是因为在使用.gsub(...,..$1..)时,在计算“,的右侧部分”时,“$1的左侧部分尚未生成,”。

这样做:

irb(main):001:0> "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/,'\1 ?')
=> "ts_id < ?"

或者这个:

irb(main):001:0> "ts_id < what".gsub(/(=|<|>)\s?(\w+|\?)/){"#{$1} ?"}
=> "ts_id < ?"