我在這個正則表達式不適用於Ruby!
<td class="generalinfo_left" align="right">Name:</td>
<td class="generalinfo_right">Burkhart, Peterson & Company</td>
我在這個正則表達式不適用於Ruby!
<td class="generalinfo_left" align="right">Name:</td>
<td class="generalinfo_right">Burkhart, Peterson & Company</td>
基因使用正則表達式解析(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 & Company</td>
將返回"Burkhart, Peterson & Company"
如何使用'Regexp :: MULTILINE'常量?不能正確理解文檔 – Shubham 2010-07-24 12:44:42
Regexp.new(/ foo bar /,Regexp :: MULTILINE) – 2010-07-24 12:46:48
你要使用/ M爲多行模式:
str.scan(/Name:</td>(.*?)</td>/m)
html.scan(Regexp.new(/Name:<\/td>(.*?)<\/td>/s))
不匹配新行字符;即使它匹配那些字符,(.*?)
部分也會在</td>
之後抓取所有內容,包括<td class="generalinfo_right">
。
爲了使正則表達式更通用,並允許以適應所要的確切文字,你應該更改代碼以
html.scan(Regexp.new(/Name:<\/td><td[^>]*>(.*?)<\/td>/s))
的正則表達式可以更好的寫法,雖然。
我也不建議用正則表達式來解析HTML/XHTML內容。
您可以通過轉到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 & Company</td>
ree-1.8.7-2010.02'> '
=> "<td class="generalinfo_left" align="right">Name:</td>\n<td class="generalinfo_right">Burkhart, Peterson & Company</td>\n"
ree-1.8.7-2010.02 > html.scan(Regexp.new(/Name:<\/td>(.*?)<\/td>/m))
=> [["\n<td class="generalinfo_right">Burkhart, Peterson & Company"]]
ree-1.8.7-2010.02 > html.scan(Regexp.new(/Name:<\/td>.*<td[^>]*>(.*?)<\/td>/m))
=> [["Burkhart, Peterson & Company"]]
ree-1.8.7-2010.02 >
相關問題:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – 2010-07-30 09:04:04