替换除Ruby中第一个以外的所有实例。正则表达式跨越多行

时间:2012-06-12 18:50:56

标签: ruby regex rubygems rest-client

我正在尝试使用restclient gem在200组(多页)中删除我最后的3200条推文。

在此过程中,我最终将以下几行添加到我的文件中:

</statuses>
<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">

为了做到这一点(因为XML解析需要折腾),在下载文件之后,我想要替换除第一个之外的所有上述字符串。 我正在尝试以下方法:

 tweets_page = RestClient.get("#{GET_STATUSES_URL}&page=#{page_number}")
      message = <<-MSG
</statuses>
<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
MSG
      unless page_number == 1
       tweets_page.gsub!(message,"")
     end

上面有什么问题?还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我相信一次下载整个群体并通过消息拆分响应的主体并将其添加到第一个条目会更快。 像这样的东西,不能尝试,所以考虑这只是一个想法。

tweets_page = RestClient.get("#{GET_STATUSES_URL}").body
tweets = tweets_page.split(message)
tweets_page = tweets[0]+message+tweets[1..-1]

你可以轻松地将它们分成200个像这样的组

如果您想在整个文本中使用gsub,可以使用以下

tweets_page = <<-MSG
first
</statuses>
<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
second
</statuses>
<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
rest
MSG

message = <<-MSG
</statuses>
<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
MSG

new_str = tweets_page.gsub message do |match|
  if defined? @first
    ""
  else
    @first = true
    message
  end
end

p new_str

给出

type=\"array\">\nrest\n"
"first\n</statuses>\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<statuses type=\"array\">\nsecond\nrest\n"