2012-03-29 5 views
1

Est-il possible de gérer l'exception si regex.Matches ne correspond rien et essayer de retourner matches.group[]Dépannage lorsque regex ne correspond pas?

J'ai une liste de 10 albums en divs HTML. Chaque album a 5 propriétés comme album cover path, album link, album name etc J'ai effectué l'analyse HTML en utilisant regex matchcollection dans une fonction et j'appelle cette fonction pour chaque propriété.

Regex regex = new Regex(pattern, RegexOptions.Compiled); 
MatchCollection mc = regex.Matches(source); 
string icerik = mc[0].Groups[group].Captures[0].Value; 

-je obtenir une liste claire comme ceci:

  • chemin de l'image: http...
  • nom de l'album: ...

Si ces pièces existent dans le code html il n'y a pas de problème. Mais le problème est, que si, par exemple, le chemin de l'image du 2ème album n'est pas fourni en html? Dans ce cas, il n'y a pas de correspondance et mc[0].Groups[group].Captures[0].Value provoque une exception de limite.

Que puis-je faire pour bloquer cette erreur avant qu'elle ne se produise?

+1

Évitez d'utiliser regex pour analyser le code HTML. Voir http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html Essayez plutôt d'utiliser une bibliothèque spécialisée (par exemple, HtmlAgilityPack) – GolfWolf

+0

[Avez-vous essayé d'utiliser un analyseur XML à la place? ?] (http://stackoverflow.com/a/1732454/26226) – jrummell

+0

maintenant je n'ai pas assez de temps pour redémarrer mais je garderai ceci dans mon esprit pour la prochaine fois. merci :) – burakokumus

Répondre

0

Cela devrait le faire.

if (mc.Count > 0 && 
    mc[0].Groups.Count > group && 
    mc[0].Groups[group].Captures.Count > 0) 
+0

J'ai utilisé comme if (mc.Count> 0 && mc [0] .Groups.Count> groupe) et cela a bien fonctionné. Merci beaucoup :) – burakokumus

0

Vous pouvez utiliser l'opérateur Any() de LINQ to Objects. Cela nécessite la bibliothèque System.Linq (partie 4.0 de .NET):

if (mc[0].Groups[group].Captures.Any()) 
{ 
    ... 
} 

Cela vous indiquera si la collection Capture contient des éléments. Si ce n'est pas le cas, alors bien sûr, vous ne pouvez pas prendre l'élément [0] ...

+0

J'utilise le framework .net 4. J'ai ajouté System.Linq mais je n'ai pas réussi à faire fonctionner la méthode Any(). J'ai résolu le problème avec la méthode d'Olivier Jacot-Descombes. Mais je serais plus sensible si vous avez une idée de la raison pour laquelle la méthode Any() n'a pas fonctionné pour moi. J'aurais besoin dans le futur. Merci beaucoup d'avoir aidé :) – burakokumus

+1

Any() est plus optimal que Count parce qu'il arrête le traitement dès qu'il a déterminé qu'il y a des éléments de données (il ne les compte pas). Vous pouvez trouver plus d'informations à ce sujet à http://msdn.microsoft.com/en-us/library/bb534972.aspx –