3

试试下面的代码:

s = '#value#'
puts s.gsub('#value#', Regexp.escape('*'))         # => '\*'
puts s.gsub('#value#', Regexp.escape('+'))         # => ''

什么?看起来 char '\+'(由 Regexp.escape 返回)完全被 gsub 忽略了。如何解决这个问题?

4

2 回答 2

3

这是因为特殊变量的插值。\+将替换为“实际参与匹配的最高编号捕获组匹配的文本”(参见http://www.regular-expressions.info/ruby.html上的特殊变量部分)

块语法实际上是对此的修复,做得很好。

于 2010-04-12T05:14:38.690 回答
1

#ruby 的 xsdg 解决了这个问题

看起来 gsub 的替换被解析了,所以 + 在过程中的某个地方丢失了。一种解决方法是使用 gsub 的块语法。这边走:

s = '#value#'
puts s.gsub('#value#') { |v| Regexp.escape('+') }          # => '+'

按预期工作:)

谢谢,xsdg!

于 2010-04-12T05:10:30.653 回答