Ruby正则表达式搜索和替换数组

时间:2014-11-10 01:33:40

标签: ruby arrays regex

我有一个包含图片网址列表的数组,我尝试使用正则表达式搜索/替换(通过gsub)。值的格式为//subdomain.website.com/folder/image.extension。我想添加' https'在每个数组条目的前面。

我试过使用gsub,但数组保持不变:

matches = source.scan(/(\/\/\w+\.\w+\.\w{2,4}\/\w+\/\w+\.\w{2,4})/).uniq
matches.each {|value| value.to_s.gsub!(/\/\//, 'https://')}

在Perl中,我可以做这样的事情来改变每个值:

for (@matches) {
    s/\/\//https:\/\//g;
}

我是否以错误的方式调用gsub函数?

4 个答案:

答案 0 :(得分:0)

首先,我发现你在to_s上调用value很奇怪,因为value是一个数组,当转换为字符串时会包含数组符号,所以{{ 1}}可能看起来像value.to_s

您可以通过将正则表达式更改为不包含捕获组来避免这种情况:

["//subdomain.website.com/folder/image.exte"]

现在问题的主要部分,您应该在/\/\/\w+\.\w+\.\w{2,4}\/\w+\/\w+\.\w{2,4}/ 上调用map,而不是matcheseach方法将数组中的每个元素更改为使用给定元素调用提供的块的结果。

放在一起可能看起来像这样:

map

答案 1 :(得分:0)

如果您知道数组的每个元素都已正确格式化并准备好"https:"前置,那么连接似乎比gsub更简单。例如,

matches.map! { |value| "https:" << value }
如果有@August所描述的字符串数组,

应该可以工作。

答案 2 :(得分:0)

你可以尝试这样的事情。

matches.map{|m| "https#{m}"}

这应该将https添加到每个元素的前面。

答案 3 :(得分:0)

Ruby为此提供了一个很好的类URI,所以请利用它:

require 'uri'

uri = URI.parse('//www.example.com')  # => #<URI::Generic:0x007ff0098581e8 URL://www.example.com>
uri.scheme = 'https'                  # => "https"
uri.to_s                              # => "https://www.example.com"

如果您要处理网址列表:

%w[
  //www.example.com
].map{ |url|                          # => ["//www.example.com"]
  uri = URI.parse(url)                # => #<URI::Generic:0x007ff009853350 URL://www.example.com>
  uri.scheme = 'https'                # => "https"
  uri.to_s                            # => "https://www.example.com"
}                                     # => ["https://www.example.com"]

URI的优势在于,如果URL已经有一个方案或者完全没有它,那么它可以做正确的事情:

require 'uri'

%w[
  http://foo.com
  https://foo.com
  //foo.com
].map { |url|
  uri = URI.parse(url)
  uri.scheme = 'https'
  uri.to_s 
} # => ["https://foo.com", "https://foo.com", "https://foo.com"]

如果你坚持使用正则表达式,那么简化它:

url = '//www.example.com'
url[/^/] = 'https:'
url # => "https://www.example.com"

%w[
  //www.example.com
].map{ |url|           # => ["//www.example.com"]
  url[/^/] = 'https:'  # => "https:"
  url                  # => "https://www.example.com"
}                      # => ["https://www.example.com"]

使用正则表达式并不足以判断方案是否已存在,因此必须编写更多代码来处理这种情况。