【问题标题】:Ruby string gsub captures invalidated if using them如果使用 Ruby 字符串 gsub 捕获无效
【发布时间】:2018-02-16 07:48:29
【问题描述】:

这里有一段典型的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() 会使捕获无效?

【问题讨论】:

    标签: ruby regex string gsub


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多