Ruby Regex匹配字符串的多个部分

时间:2012-09-10 07:23:08

标签: ruby regex

使用Ruby:ruby 1.9.3dev(2011-09-23修订版33323)[i686-linux]

我有以下字符串:

str = 'Message relates to activity <a href="/activities/35">TU4 Sep 5 Activity 1</a> <img src="/images/layout/placeholder.png" width="222" height="149"/><br/><br/>First question from Manager on TU4 Sep 5 Activity 1.'

我想匹配以下内容:

  

35(作为href属性值的一部分的数字)
  TU4 Sep 5活动(标签文字)
  来自TU4经理的第一个问题9月5日活动1.(最后<br/><br/>个标签后的剩余文本)

为了达到同样的目的,我写了以下正则表达式

result = str.match(/<a href="\/activities\/(?<activity_id>\d+)">(?<activity_title>.*)<\/a>.*<br\/><br\/>(?<message>.*)/)

这会产生以下结果:

#<MatchData "<a href=\"/activities/35\">TU4 Sep 5 Activity 1</a> <img src=\"/images/layout/placeholder.png\" width=\"222\" height=\"149\"/><br/><br/>First question from Manager on TU4 Sep 5 Activity 1." 
         activity_id:"35" 
         activity_title:"TU4 Sep 5 Activity 1" 
         message:"First question from Manager on TU4 Sep 5 Activity 1.">

但我猜这不高效。 有可能以某种方式仅在匹配的结果和以下内容中返回所需的值(如上所述我想要匹配) 值从匹配结果中排除:

"<a href=\"/activities/35\">TU4 Sep 5 Activity 1</a> <img src=\"/images/layout/placeholder.png\" width=\"222\" height=\"149\"/><br/><br/>First question from Manager on TU4 Sep 5 Activity 1."

谢谢,

Jignesh

1 个答案:

答案 0 :(得分:1)

执行此操作的适当方法是不使用regexen。相反,使用Nokogiri库轻松解析您的HTML:

require 'nokogiri'

doc = Nokogiri::HTML.parse(str)
activity_id = doc.css('[href^="/activities"]').attr('href').value[/\d+$/]
activity_title = doc.css('[href^="/activities"]')[0].inner_text
message = doc.search("//text()").last

这将完全符合您的正则表达式尝试,随机失败的可能性要小得多。