ruby регулярное выражение сканирование нескольких совпадений - PullRequest
0 голосов
/ 25 ноября 2011

Я пытаюсь получить текст между двумя тегами.

<b> foo</b>bar<br/> => bar

Я попытался использовать '<b>asdasd</b>qwe<br/>'.scan(/<b>[a-zA-Z0-9]*<\/b>(.*)<br\/>/), и это дает мне правильный результат.

но когда я пытаюсь это сделать:

'<b>exclude</b>op1<br/>exclude 2<b>exclude</b>op2<br/>exclude 2<b>exclude</b>op3<br/>exclude 2'.scan(/<b>[a-zA-Z0-9]*<\/b>(.*)<br\/>/) { |ele|
puts ele
}

Соответствует первому тегу <b> и последнему тегу <br/> и возвращает всю ожидаемую строку массива совпадений

Ответы [ 2 ]

9 голосов
/ 25 ноября 2011

Вместо использования регулярных выражений в html используйте nokogiri:

Nokogiri::HTML.fragment(str).css('b').each do |b|
    puts b.next.text
end
8 голосов
/ 25 ноября 2011

Измените (.*) на (.*?), чтобы сделать его непривлекательным

/<b>[a-zA-Z0-9]*<\/b>(.*?)<br\/>/

Test

[2] pry(main)> '<b>exclude</b>op1<br/>exclude 2<b>exclude</b>op2<br/>exclude 2<b>exclude</b>op3<br/>exclude 2'.scan(/<b>[a-zA-Z0-9]*<\/b>(.*?)<br\/>/) { |ele|
[2] pry(main)*   puts ele
[2] pry(main)* }  
op1
op2
op3
...