这里有一段典型的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()
会导致捕获无效?
答案 0 :(得分:2)
为什么调用
sub()
会导致捕获无效?
出于同样的原因,为什么要调用gsub
设置。这是这些方法的副作用,它们设置了这些伪全局变量。
通过阅读文档,您可能会得到这些变量仅以块形式设置的印象。事实并非如此。
'foobar'.sub(/(foo)/, 'bar') # => "barbar"
$1 # => "foo"
由于您的sub
模式不包含匹配组(并且它甚至不是正则表达式),因此自然会清除捕获伪全局变量。
'foobar'.sub('foo', 'bar') # => "barbar"
$1 # => nil