2010-07-24 141 views
0

我在這個正則表達式不適用於Ruby!

<td class="generalinfo_left" align="right">Name:</td> 
<td class="generalinfo_right">Burkhart, Peterson &amp; Company</td> 

+0

相關問題:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – 2010-07-30 09:04:04

回答

4

基因使用正則表達式解析(X)HTML是不好的做法。 Ruby有很棒的Nokogiri庫,它使用libxml2來高效地解析XHTML。

這就是說,你的.不符合換行符。爲您的正則表達式使用m修飾符,該修飾符告訴.匹配新行。或Regexp :: MULTILINE常量。有文件記錄here

您的正則表達式還會在您需要的文本之前捕獲HTML。

使用nokogiri和XPath將意味着您可以通過引用其CSS類來獲取此表格單元格的內容。就像這樣:

#!/usr/bin/env ruby 

require 'nokogiri' 

doc = Nokogiri::HTML DATA.read 

p doc.at("td[@class='generalinfo_right']").text 

__END__ 
<td class="generalinfo_left" align="right">Name:</td> 
<td class="generalinfo_right">Burkhart, Peterson &amp; Company</td> 

將返回"Burkhart, Peterson & Company"

+0

如何使用'Regexp :: MULTILINE'常量?不能正確理解文檔 – Shubham 2010-07-24 12:44:42

+0

Regexp.new(/ foo bar /,Regexp :: MULTILINE) – 2010-07-24 12:46:48

2

/m使用下面的正則表達式

html.scan(Regexp.new(/Name:<\/td>(.*?)<\/td>/s)) 

相匹配的名字[Burkhart, Peterson &amp; Company]使點匹配換行符

+0

仍然沒有工作! – Shubham 2010-07-24 12:30:39

+0

在非Ruby正則表達式中,它在這裏工作(沒有Ruby可用a.t.m.)。你確定這個字符串是你聲稱的嗎? – Wrikken 2010-07-24 12:38:12

0

你要使用/ M爲多行模式:

str.scan(/Name:</td>(.*?)</td>/m)

0

html.scan(Regexp.new(/Name:<\/td>(.*?)<\/td>/s))不匹配新行字符;即使它匹配那些字符,(.*?)部分也會在</td>之後抓取所有內容,包括<td class="generalinfo_right">

爲了使正則表達式更通用,並允許以適應所要的確切文字,你應該更改代碼以

html.scan(Regexp.new(/Name:<\/td><td[^>]*>(.*?)<\/td>/s)) 

的正則表達式可以更好的寫法,雖然。

我也不建議用正則表達式來解析HTML/XHTML內容。

0

您可以通過轉到rubular.com來驗證所有建議您添加/ m或Regexp :: MULTILINE的答案是否正確。

我也在控制檯驗證瞭解決方案,並修改了正則表達式,以便它只返回名稱而不是所有額外的垃圾。

Loading development environment (Rails 2.3.8) 
ree-1.8.7-2010.02 > html = '<td class="generalinfo_left" align="right">Name:</td> 
ree-1.8.7-2010.02'> <td class="generalinfo_right">Burkhart, Peterson &amp; Company</td> 
ree-1.8.7-2010.02'> ' 
=> "<td class="generalinfo_left" align="right">Name:</td>\n<td class="generalinfo_right">Burkhart, Peterson &amp; Company</td>\n" 
ree-1.8.7-2010.02 > html.scan(Regexp.new(/Name:<\/td>(.*?)<\/td>/m)) 
=> [["\n<td class="generalinfo_right">Burkhart, Peterson &amp; Company"]] 
ree-1.8.7-2010.02 > html.scan(Regexp.new(/Name:<\/td>.*<td[^>]*>(.*?)<\/td>/m)) 
=> [["Burkhart, Peterson &amp; Company"]] 
ree-1.8.7-2010.02 > 
相關問題