2010-07-24 6 views
0

J'utilise l'expression rationnelle suivanteRegEx Ne fonctionne pas dans Ruby!

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

pour correspondre au nom [Burkhart, Peterson &amp; Company] dans ce

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

+0

question connexe: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

Répondre

4

Gene Rassembler l'analyse syntaxique (X) HTML à l'aide d'expressions régulières est une mauvaise pratique. Ruby a la fantastique bibliothèque Nokogiri qui utilise libxml2 pour analyser efficacement le XHTML.

Cela étant dit, votre . ne correspond pas aux nouvelles lignes. Utilisez le modificateur m pour votre expression rationnelle qui indique au . de faire correspondre les nouvelles lignes. Ou la constante Regexp :: MULTILINE. Documenté here

Votre expression régulière capture également le code HTML avant le texte dont vous avez besoin. Utiliser nokogiri et XPath signifierait que vous pourriez récupérer le contenu de cette cellule de table en vous référant à sa classe CSS. Comme ceci:

#!/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> 

qui retournera "Burkhart, Peterson & Company"

+0

Comment utiliser la constante 'Regexp :: MULTILINE'? Je ne comprends pas correctement de la documentation – Shubham

+0

Regexp.new (/ foo bar /, Regexp :: MULTILINE) –

2

/m fait les sauts de ligne match dot

+0

ne fonctionne toujours pas! – Shubham

+0

Dans les regex non Ruby, cela fonctionne ici (pas de Ruby disponible a.t.m.). Êtes-vous sûr que la chaîne est telle que vous l'affirmez? – Wrikken

0

Vous voulez utiliser/m pour le mode multiligne:

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

0

html.scan(Regexp.new(/Name:<\/td>(.*?)<\/td>/s)) ne correspond pas aux caractères de nouvelle ligne; même s'il correspond à ces caractères, la partie (.*?) saisirait tout après </td>, y compris <td class="generalinfo_right">.

Pour rendre l'expression régulière plus générique, et permettent de faire correspondre le texte exact que vous voulez, vous devez modifier le code pour

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

L'expression régulière pourrait être mieux écrit, cependant.

Je ne suggère pas non plus d'analyser le contenu HTML/XHTML avec une expression régulière.

0

Vous pouvez vérifier que toutes les réponses suggérant que vous ajoutez/m ou Regexp :: MULTILINE sont correctes en allant sur rubular.com.

J'ai également vérifié la solution dans la console, et également modifié l'expression régulière de sorte qu'il renverrait seulement le nom au lieu de tout le rebut supplémentaire.

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 > 
Questions connexes