Извлечение URL (в массив) в Ruby - PullRequest
1 голос
/ 07 апреля 2010

Добрый день,

Я изучаю использование RegEx в Ruby, и настал момент, когда мне нужна помощь. Я пытаюсь извлечь 0 из множества URL из строки.

Это код, который я использую:

sStrings = ["hello world: http://www.google.com", "There is only one url in this string http://yahoo.com . Did you get that?", "The first URL in this string is http://www.bing.com and the second is http://digg.com","This one is more complicated http://is.gd/12345 http://is.gd/4567?q=1", "This string contains no urls"]
sStrings.each  do |s|
  x = s.scan(/((http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.[\w-]*)?)/ix)
  x.each do |url|
    puts url
  end
end

Вот что возвращается:

http://www.google.com
http
.google
nil
nil
http://yahoo.com
http
nil
nil
nil
http://www.bing.com
http
.bing
nil
nil
http://digg.com
http
nil
nil
nil
http://is.gd/12345
http
nil
/12345
nil
http://is.gd/4567
http
nil
/4567
nil

Каков наилучший способ извлечь только полные URL, а не части RegEx?

Ответы [ 2 ]

4 голосов
/ 07 апреля 2010

Вы можете использовать анонимные группы захвата (?: ...) вместо (...) .

Я вижу, что вы делаете это вЧтобы изучить Regex, но в случае, если вы действительно хотите извлечь URL из строки, взгляните на URI.extract, который извлекает URI из строки.(require "uri" для того, чтобы использовать его)

1 голос
/ 07 апреля 2010

Вы можете создать группу без захвата, используя (?:SUB_PATTERN). Вот иллюстрация с некоторыми дополнительными упрощениями. Кроме того, поскольку вы используете опцию /x, воспользуйтесь ей, изложив свое регулярное выражение в удобочитаемой форме.

sStrings = [
    "hello world: http://www.google.com",
    "There is only one url in this string http://yahoo.com . Did you get that?",
    "... is http://www.bing.com and the second is http://digg.com",
    "This one is more complicated http://is.gd/12345 http://is.gd/4567?q=1",
    "This string contains no urls",
]

sStrings.each  do |s|
    x = s.scan(/
        https?:\/\/
        \w+
        (?: [.-]\w+ )*
        (?:
            \/
            [0-9]{1,5}
            \?
            [\w=]*
        )?
    /ix)

    p x
end

Это хорошо для изучения, но на самом деле не пытайтесь сопоставить URL-адреса таким образом. Для этого есть инструменты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...