1

我想从字符串中提取“toast” <h1>test</h1><div>toast</div>。什么正则表达式可以隔离这样的字符串?

编辑:感谢更正格式的用户。

更多信息:总是只有一个 div 标签的实例,里面的信息可能会改变,但在同一个字符串中永远不会有另一个 div 标签(字符串大于给定的样本)

谢谢!

4

3 回答 3

6

您可以使用Nokogiri.

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse("<div> test </div> <div> toast </div>")
doc.css('div').map(&:text)
# => [" test ", " toast "]

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse("<h1>test</h1><div>toast</div>")
doc.at_css('div').text
# => "toast"
于 2013-08-07T17:48:07.473 回答
1

我们需要更多信息。如果字符串完全是"<h1>test</h1><div>toast</div>",那么有些天真

regex = /<h1>test<\/h1><div>([^<]*)<\/div>/
found = "<h1>test</h1><div>toast</div>".match(regex)[1]
# => "toast"

会工作。在这一点上我最好的猜测是你期待

<h1>*</h1><div>*</div>

然后使用这个:

regex = /<h1>[^<]*<\/h1><div>([^<]*)<\/div>/
found = "<h1>any string can go here</h1><div>toast</div>".match(regex)[1]
# => "toast"

请注意,如果任一标签中有任何嵌套元素,则会中断。更强大的解决方案是使用 Nokogiri。和你的老板谈谈。

于 2013-08-07T17:57:00.557 回答
1

这真的不是通常用正则表达式完成的事情......并且有充分的理由,但是如果你必须并且因为你说它里面永远不会有超过一个 div ......这应该适合你:

(?<=<div>).*(?=</div>)
于 2013-08-07T18:07:41.297 回答