2015-01-10 3 views
0

Мой вопрос прост, вот линия:Элегантный способ извлечения информации в Рубине REGEX

<title><* page.title *></title> 

я хочу, чтобы получить «page.title» часть. Я могу это сделать:

replacement = line.match(/\<\* .* \*\>/) 
replacement_contain = replacement.to_s.match(/ .* /).to_s.strip  

Есть ли какой-либо ярлык или лучший способ сделать это?

+0

Если вы не знакомы с 'nokogiri', вы должны потратить время, чтобы изучить его. Мне сказали, что это довольно просто. –

+0

@ Кэри, спасибо, что оставил меня в нокогири, понятия не имею, почему я его не использовал. – user2543457

ответ

1
" <title><* page.title *></title> "[/(?<=\*).*(?=\*)/].strip #=> "page.title" 
+0

приятный ответ, спасибо – user2543457

1

Одним из способов является использование захвата группы:

str = "<title><* page.title *></title>" 

str[/\*\s+(.*)\s+\*/,1] 
    #=> "page.title" 

Регулярное выражение говорит в соответствии с:

\* : one asterisk, followed by 
\s+ : one or more spaces, followed by capture group #1 
(.*) : which matches all characters until it reaches the last 
\s+ : string of one or more spaces in the line that is followed by 
\* : an asterisk 

\1 является содержание группы захвата # 1, который извлекается и возвращается String#[].

2
require 'nokogiri' 
require 'open-uri' 

html = Nokogiri.HTML open('https://stackoverflow.com/questions/27879967/elegant-way-to-extarct-information-ruby-regex') 

puts html.css('title').text 
# => "Elegant way to extarct information ruby regex - Stack Overflow" 

Ответ на «как я могу разобрать HTML с регулярным выражением» является "don't, unless you know it will conform to strict XML rules."

Например, @ Саввы и @ решений Кэри, в то время как хорошо, если вы знаете, что содержание вашей HTML будет содержать, потерпеть неудачу, если вам есть *> где-нибудь еще на вашей странице, что вполне допустимо HTML. Вместо этого используйте парсер HTML, например, Nokogiri (продемонстрировано выше).

+0

Хороший совет, который я видел, которого многие раздавали. –

Смежные вопросы