2009-12-08 4 views
0

У меня есть следующая строка. Как я могу извлечь часть «somesite.com/2009/10/monit-on-ubuntu/» из нее, используя регулярное выражение ruby?ruby ​​регулярное выражение и извлечение из строки

http://linkto.com/to/1pyTZl/somesite.com/2009/10/monit-on-ubuntu/t 

Распространенное есть, начинается с "/ в/некоторые альфа-Num" и всегда заканчивается "/ т"

ответ

6

Эта строка выглядит так, как будто это не строка, а URI. Итак, давайте рассматривать его как один:

require 'uri' 
uri = URI.parse(str) 

Теперь, извлекая компонент путь URI кусок пирога:

path = uri.path 

Сейчас мы уже сильно ограничено количество вещей, которые могут пойти неправильно с нашим собственным анализом. Единственная часть URI, с которой нам все еще приходится иметь дело, - это компонент пути.

Regexp, который соответствует той части, которую интересует выглядит следующим образом:

%r|/to/\w+/(.*/)t$|i 

Если мы все это вместе, мы в конечном итоге с чем-то вроде этого:

require 'uri' 

def URI.extract(uri) 
    return parse(uri).path[%r|/to/\w+/(.*/)t$|i, 1] 
end 

require 'test/unit' 
class TestUriExtract < Test::Unit::TestCase 
    def test_that_the_path_gets_extracted_correctly 
    uri = 'http://linkto.com/to/1pyTZl/somesite.com/2009/10/monit-on-ubuntu/t' 
    path = 'somesite.com/2009/10/monit-on-ubuntu/' 
    assert_equal path, URI.extract(uri) 
    end 
end 
+0

поддерживается для использования ответных действий. – akuhn

0

Может быть, с /\/to\/[^\/]*\/(.*)\/t/:

"http://linkto.com/to/1pyTZl/somesite.com/2009/10/monit-on-ubuntu/t" =~ /\/to\/[^\/]*\/(.*)\/t/ 
puts $1 

->somesite.com/2009/10/monit-on-ubuntu

2

//to/\w+/(.*)/t/i

Отличный ресурс Rubular. Это позволяет вам проверять ваше выражение на входы и видеть совпадения.

+0

Рубельный инструмент - хороший инструмент, мне он нравится. –

+0

страдает синдромом наклонившейся зубочистки. используйте '% r', чтобы выбрать разные разделители. –

2

ответы так далеко вправо, но вы должны убедиться, что конечный /t действительно находится в конце строки, используя подстановочный знак $

regex = %r(/to/[^/]+/(.*)/t$) 
'http://linkto.com/to/1pyTZl/somesite.com/2009/10/monit-on-ubuntu/t' =~ regex 
puts $1 
+0

Спасибо. Я обновил свой ответ соответственно. –

0
s = "http://linkto.com/to/1pyTZl/somesite.com/2009/10/monit-on-ubuntu/t" 
puts s[/to\/.+?\/(.*)\/t$/, 1] 
=> somesite.com/2009/10/monit-on-ubuntu 
Смежные вопросы