Это старый, но хороший вопрос. Вот ответ, основанный на встроенном URI в Ruby:
require 'set'
require 'uri'
text = '@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3'
schemes_regex = /^(?:#{ URI.scheme_list.keys.join('|') })/i
URI.extract(text).each do |url|
text.gsub!(url, '') if (url[schemes_regex])
end
puts text.squeeze(' ')
И проход через IRB, показывающий, что происходит, и полученный результат:
Я определил текст для поиска:
irb(main):004:0* text = '@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3'
=> "@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3"
Я определил регулярное выражение схем URI, на которые мы хотим реагировать. Это защитный шаг, потому что URI возвращает ложноположительный результат на этапе поиска:
irb(main):006:0* schemes_regex = /^(?:#{ URI.scheme_list.keys.join('|') })/i
=> /^(?:FTP|HTTP|HTTPS|LDAP|LDAPS|MAILTO)/i
Позвольте URI пройти по текстовым URL-адресам. Для каждого найденного, если это схема, на которую мы хотим реагировать, уберите все ее вхождения из текста:
irb(main):008:0* URI.extract(text).each do |url|
irb(main):009:1* text.gsub!(url, '') if (url[schemes_regex])
irb(main):010:1> end
Вот URL URI.extract
найдено. Он ошибочно сообщает BreakingNews:
из-за завершающего :
. Я думаю, что это не слишком сложно, но для нормального использования это хорошо:
=> ["BreakingNews:", "http://news.bnonews.com/u4z3"]
Показать, что получился в результате текст:
irb(main):012:0* puts text.squeeze(' ')
@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands