我想枚举文本字符串中的所有网址,例如:
text = "fasòls http://george.it sdafsda"
对于找到的每个网址,我想调用一个转换字符串的函数method(...)
。
现在我正在使用这样的方法:
msg = ""
for i in text.split
if (i =~ URI::regexp).nil?
msg += " " + i
else
msg+= " " + method(i)
end
end
text = msg
这有效,但对于长字符串来说速度很慢。我怎样才能加快速度呢?
答案 0 :(得分:1)
我认为“gsub”是你的朋友:
class UrlParser
attr_accessor :text, :url_counter, :urls
def initialize(text)
@text = parse(text)
end
private
def parse(text)
@counter = 0
@urls = []
text.gsub(%r{(\A|\s+)(http://[^\s]+)}) do
@urls << $2
"#{$1}#{replace_url($2)}"
end
end
def replace_url(url)
@counter += 1
"[#{@counter}]"
end
end
parsed_url = UrlParser.new("one http://x.com/url two")
puts parsed_url.text
puts parsed_url.urls
如果您确实需要对长字符串进行额外快速解析,则应使用ragel构建ruby C扩展。