试试下面的代码:
s = '#value#'
puts s.gsub('#value#', Regexp.escape('*')) # => '\*'
puts s.gsub('#value#', Regexp.escape('+')) # => ''
什么?看起来 char '\+'(由 Regexp.escape 返回)完全被 gsub 忽略了。如何解决这个问题?
这是因为特殊变量的插值。\+
将替换为“实际参与匹配的最高编号捕获组匹配的文本”(参见http://www.regular-expressions.info/ruby.html上的特殊变量部分)
块语法实际上是对此的修复,做得很好。
#ruby 的 xsdg 解决了这个问题
看起来 gsub 的替换被解析了,所以 + 在过程中的某个地方丢失了。一种解决方法是使用 gsub 的块语法。这边走:
s = '#value#'
puts s.gsub('#value#') { |v| Regexp.escape('+') } # => '+'
按预期工作:)
谢谢,xsdg!