2009-09-01 3 views
0

Je suis en train d'écrire une expression régulière pour correspondre à des modèles comme celui-ci:expression rationnelle ne correspond pas à la fin

<td style="alskdjf" /> 

-à-dire une auto terminaison <td>

mais pas:

<td style=alsdkjf"><br /></td> 

Je suis d'abord venu avec:

<td\s+.*?/> 

mais échoue évidemment sur le deuxième exemple et je pensais que quelque chose comme cela pourrait fonctionner:

<td\s+.*?[^>]/> 

mais il ne fonctionne pas. J'utilise C# .NET. Rechercher seulement <td> qui ont un attribut.

par exemple. la recherche <td style="alsdfkj" /> mais pas <td>.

Répondre

4

Cela correspondre à ce que vous cherchez, et ne pas correspondre au cas problématique que vous aviez avec vos premiers essais:

<td[^>]*?/> 

Notez toutefois que si vous avez besoin pour permettre > caractères dans les valeurs d'attributs , vous auriez besoin de quelque chose comme ceci:

<td(?:[^>]|"[^"]*?")*?/> 

qui permet > que dans correspondance entre guillemets doubles (vous pouvez l'étendre de la même pour permettre les guillemets simples).

Vous pouvez ajouter n'importe quel attribut spécifique que vous recherchez dans la regex; par exemple pour votre exemple:

<td[^>]*? style="alskdjf"[^>]*?/> 
4

Vous allez avoir des problèmes pour utiliser des regexps avec HTML puisque HTML n'est pas régulier. Je recommande d'utiliser un analyseur HTML pour tous les cas, sauf les plus simples.

+0

Cela dépend du cas. Une balise auto-terminante comme celle que l'OP essaie de faire correspondre est, en fait, régulière tant qu'aucun caractère '>' n'est attendu dans les valeurs d'attribut. – Amber

+0

Sauf si vous voulez faire correspondre l'équivalent syntaxique , bien sûr. –

+0

Correct. Cependant, vous pouvez à nouveau étendre l'expression régulière pour qu'elle corresponde à cela - ajoutez simplement '(><)?' Avant la partie '/ td>' du motif. – Amber

2

Regex aura du mal à interpréter sérieux HTML désordre, comme souvent les navigateurs de tri doivent traiter. Il y a toutes sortes d'obfuscations horribles qui peuvent être faites au balisage que vous ne voulez pas avoir à penser!

Le HTML Agility Pack est ce que vous voulez vraiment utiliser, et a eu de très bonnes critiques partout où j'ai vu. C'est une bibliothèque robuste pour lire n'importe quel type de code HTML tronqué dans un modèle DOM. J'ai personnellement trouvé que c'était une superbe bibliothèque, comme sûrement d'autres, beaucoup utilisant la bibliothèque dans le contexte des applications professionnelles.

Questions connexes