Я не проверял синтаксис вашего регулярного выражения, но String.scan создаст массив, каждый из членов которого является массивом групп, соответствующих вашему регулярному выражению. Поэтому я ожидаю, что результат будет:
[['http', '.google.com'], ...]
Вам понадобятся несоответствующие группы /(?:stuff)/
, если вы хотите формат, который вы указали.
Редактировать (глядя на регулярное выражение): Кроме того, ваше регулярное выражение выглядит немного неправильно. Вам не нужны начальные и конечные якоря (^
и $
), так как вы не ожидаете совпадения в начале и конце content
. Во-вторых, если ваш ([0-9]{1,5})?
пытается захватить номер порта, я думаю, вам не хватает двоеточия для отделения домена от порта.
Дальнейшее редактирование после игры: Я думаю, вы хотите что-то вроде этого:
content = "Here is the list of URLs: http://www.google.com http://www.google.com/index.html http://example.com:3000/foo"
urls = content.scan(/(?:http|https):\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(?:(?::[0-9]{1,5})?\/[^\s]*)?/ix)
# => ["http://www.google.com", "http://www.google.com/index.html", "http://example.com:3000/foo"]
... но учтите, что он не будет совпадать с URL-адресами с чистым IP-адресом (например, http://127.0.0.1
) из-за [a-z]{2,5}
для TLD.