2009-12-12 9 views
0

J'ai cherché et recherché des regex mais je n'arrive pas à trouver quelque chose qui me permettra de le faire.Regex HTML Extraction C#

J'ai besoin pour obtenir le 12,32, 2,300, 4,644 M et 12,444.12 des chaînes suivantes en C#:

<td class="c-ob-j1a" property="c-value">12.32</td> 
<td class="c-ob-j1a" property="c-value">2,300</td> 
<td class="c-ob-j1a" property="c-value">4.644 M</td> 
<td class="c-ob-j1a" property="c-value">12,444.12 M</td> 

Je me suis levé à ceci:

MatchCollection valueCollection = Regex.Matches(html, @"<td class=""c-ob-j1a"" property=""c-value"">(?<Value>P{</td>})</td>"); 

Merci!

+10

Vous n'utiliserez pas d'expressions régulières pour analyser HTML. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – dtb

+1

Omg J'aimerais pouvoir me souvenir de cette réponse géniale à une question similaire comment vous ne pouvez pas utiliser regex pour analyser html (de manière fiable) ... Je suis sûr que quelqu'un me fera les honneurs ... :-) – Tom

+0

@dtb: oui !!! Voir ... c'est arrivé pendant que je tapais mon commentaire :-). – Tom

Répondre

2
"value">(.*?)<\/td> 

devrait le faire pour vous. La valeur dont vous avez besoin se tiendrait dans le groupe de capture notée par les parenthèses

+0

Merci beaucoup! Pour une raison qui n'est pas dans les tutoriels RegEx – jonperl

+0

Merci beaucoup ... –

0

Quelque chose comme cela devrait fonctionner:

/<td[.]*?>(.+)<\/td>/ 

En ce qui concerne votre exemple de code, ce serait probablement plus maintenable:

MatchCollection valueCollection = Regex.Matches(html, @"<td[^>]*?>(?<Value>.*?)</td>") 

Si votre code HTML contient d'autres td dont vous ne voulez pas extraire de données, votre expression régulière d'origine devrait convenir.

0

je serais probablement commencer par un match très stricte pour éviter la capture accidentelle d'autres parties du document:

static void Main(string[] args) 
    { 
     string html = @"<td class=""c-ob-j1a"" property=""c-value"">12.32</td> 
<td class=""c-ob-j1a"" property=""c-value"">2,300</td> 
<td class=""c-ob-j1a"" property=""c-value"">4.644 M</td> 
<td class=""c-ob-j1a"" property=""c-value"">12,444.12 M</td>"; 

     var matches = Regex.Matches(html, @"<td class=""c-ob-j1a"" property=""c-value"">([^<]*)</td>"); 
     foreach (Match match in matches) 
      Console.WriteLine(match.Groups[1].Value); 
    } 

(Et je voudrais également saisir cette occasion pour recommander le Html Agility Pack si vous vous ne l'avez pas encore essayé.)

-1

Si tout ce dont vous avez besoin est d'analyser le tag td dans les formats que vous avez présentés, vous pourriez vous en sortir avec une regex.

En général, l'analyse de html avec regex ne fonctionne pas. Vous pouvez trouver beaucoup de questions ici sur SO expliquant pourquoi