如果使用Ruby字符串gsub捕获无效

时间:2018-02-16 07:48:30

标签: ruby regex string gsub

这里有一段典型的gsub代码:

str = '[caption id="attachment_3655" align="aligncenter" width="1024"]<a href="http://test.com/wp-content/uploads/2018/01/sample-image.jpg"><img class="size-large wp-image-3655" src="{{ site.baseurl }}/assets/sample-image-1024x768.jpg" alt="" width="1024" height="768" /></a> Image title[/caption]'

p str.gsub(/\[caption.*?\]<a href=\"(.+?)\".*?><img .*?\/><\/a>(.+?)\[\/caption\]/) { |match|
  href = $1.sub("http://test.com/wp-content/uploads/", "")
  title = $2

  "#{href} - #{title}"
}

此次通话后$1.sub("http://test.com/wp-content/uploads/", "")捕获数据$2变为nil。如果我首先访问上面的$2,它就有效。为什么调用sub()会导致捕获无效?

1 个答案:

答案 0 :(得分:2)

  

为什么调用sub()会导致捕获无效?

出于同样的原因,为什么要调用gsub 设置。这是这些方法的副作用,它们设置了这些伪全局变量。

通过阅读文档,您可能会得到这些变量仅以块形式设置的印象。事实并非如此。

'foobar'.sub(/(foo)/, 'bar') # => "barbar"
$1 # => "foo"

由于您的sub模式不包含匹配组(并且它甚至不是正则表达式),因此自然会清除捕获伪全局变量。

'foobar'.sub('foo', 'bar') # => "barbar"
$1 # => nil