使用正则表达式

时间:2017-08-02 11:36:55

标签: ruby split

我有一个字符串包含(实际上没有换行符)

<td class="coll-1 name">
  <a href="/sub/48/0/" class="icon"><i class="flaticon-divx"></i></a>
  <a href="/torrent/2349324/some-stuuf-here/">SAME stuff here</a>
  <span class="comments"><i class="flaticon-message"></i>1</span>
</td>

我想要一个数组来存储使用href="/">分割的字符串。我怎样才能做到这一点。我试过这个。

new_array=my_string.split(/ href="  ,   \/">/)

修改

.split(/href="/)

这样做太好了,但与其他部分没有关系。

.split(/\/">/)

同样这也有效但我无法将它们组合成一行。

2 个答案:

答案 0 :(得分:2)

鉴于此字符串:

string = <<-HTML
  <td class="coll-1 name">
    <a href="/sub/48/0/" class="icon"><i class="flaticon-divx"></i></a>
    <a href="/torrent/2349324/some-stuuf-here/">SAME stuff here</a>
    <span class="comments"><i class="flaticon-message"></i>1</span>
  </td>
HTML

并假设正确的链接是没有icon类的链接,您可以使用CSS选择器a:not(.icon),例如通过Nokogiri

require 'nokogiri'

doc = Nokogiri::HTML::DocumentFragment.parse(string)

doc.at_css('a:not(.icon)')[:href]
#=> "/torrent/2349324/some-stuuf-here/"

答案 1 :(得分:1)

你可以利用 lookahead lookbehind ,如下所示:

my_string.scan(/(?<=href=").*(?=\/">)/)
#=> ["/torrent/2349324/some-stuuf-here"]

这将返回一个数组,其中所有出现的href=" ... /">只有...部分(可以是任何字符串)。

或者您可以获取与href=".../">匹配的所有内容,然后删除href="和结尾/">,如下所示:

my_string.scan(/(?:href=".*\/">)/).map { |e| e.gsub(/(href="|\/">)/, "") }
#=> ["/torrent/2349324/some-stuuf-here"]

这将返回与/href=".*\/">/匹配的所有实例的数组。

  

如何使用正则表达式使用2个关键字进行拆分

您可以使用|表示正则表达式中的,如下所示:

my_string.split(/(?:href="|/">)/)