2009-09-03 5 views
0

J'ai une page HTML (il est hors d'une application de carnet d'adresses interne) et j'essaie de faire correspondre à la fois le nom du champ et la valeur du champ sur une table.Expression régulière .NET -? ne fonctionne pas (comme je pense qu'il devrait)

L'expression régulière que j'ai concocté est jusqu'à présent

"href.*?>(.*?)<\\/a.*>(.*?)<\\/span" 

qui correspond à la plupart des clés et des valeurs très bien. Le problème est que certaines des valeurs sont aussi des liens.

chaîne Exemple (sans lien - travaux)

href="JavaScript:updateField(&quot;peopleType&quot;, &quot;390061&quot;, &quot;[email protected]&quot;, &quot;bob&quot;, &quot;Reg&quot;, &quot;Bob Bobson&quot;);" onMouseOver="window.status='Update this field if possible, else explain how to update it';return true;" onMouseOut="window.status='';return true;">Emp Type</a></span></td> 
<td nowrap=""><span style="font-family: Arial, Times New Roman, Courier New, Courier, monospace; color: #006699">Reg</span 

chaîne Exemple (avec lien - ne fonctionne pas)

href="JavaScript:updateField(&quot;dept&quot;, &quot;390061&quot;, &quot;[email protected]&quot;, &quot;bob&quot;, &quot;Reg&quot;, &quot;Bob Bobson&quot;);" onMouseOver="window.status='Update this field if possible, else explain how to update it';return true;" onMouseOut="window.status='';return true;">Dept</a></span></td> 
<td nowrap=""><span style="font-family: Arial, Times New Roman, Courier New, Courier, monospace"> 
<a href="JavaScript:showDept('TheBobs');" onMouseOver="window.status='Show People in This Dept';return true;" onMouseOut="window.status='';return true;">TheBobs</a></span 

La première moitié (capture la clé) sur les œuvres correctement.Procédé (semble être) que le gourmand. * correspond tout le chemin jusqu'à la fin du lien où il trouve le caret de fin, puis le non-gourmand. *? dans le groupe de capture n'a plus rien à faire correspondre. J'ai essayé le RegEx

"href.*?>(.*?)<\\/a.*>(.*?)(<\\/a>)?<\\/span" 

qui fonctionne très bien pour les cordes avec le lien (le troisième groupe de capture - avec le/a en elle) correspond à la fin du lien pour mon deuxième groupe de capture fonctionne, mais il ne fonctionne pas sur des valeurs qui ne sont pas des liens car (je pense) c'est la recherche du lien de fermeture. Je pensais que le? à la fin de ce groupe de capture devrait le rendre facultatif.

Je fais correspondre avec RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline.

Comment puis-je obtenir l'expression régulière pour correspondre à la fois le cas avec un lien dans la valeur, et sans? Merci.

+0

Quels sont exactement le "nom de champ" et la "valeur de champ" supposés être dans vos échantillons? – Lucero

Répondre

3

Je considérerais le pré-traitement du HTML et la suppression du contenu connu pour déclencher l'implémentation de regex.

En ce qui concerne les testeurs, vous pouvez également utiliser Regex Hero car l'implémentation Regex de Silverlight est compatible avec .NET.

+1

+1 - Je cherchais un testeur regex en ligne décent, merci! –

1

Il existe un outil gratuit appelé Regex Coach que vous pouvez utiliser pour déboguer facilement vos expressions régulières.

0

Essayez:

href[^<>]+>(.*?)<\\/a[^<>]*>(.*?)<\\/span 

D'après ce que je peux dire, il ressemble est d'être trop gourmand et j'essaie toujours d'être aussi précis que possible lors de l'écriture de Regex ... qui «/a *>. » pourquoi j'ai utilisé "[^ <>] +"

1

Évitez le "." personnage. Cela ne vous donne habituellement que des ennuis ... parce que ce n'est pas spécifique.

Essayez quelque chose comme ceci:

href=[^>]*>([^<]*)</a\s*>((?:(?!</span\s*>).)*) 

Note: puisque votre échantillon ne retourne pas une paire nom-valeur, mais seulement un nom (en supposant que le premier groupe de capture est le nom), je ne » Je ne sais pas à quoi vous vous attendez. Peut-être postez un échantillon plus complet et spécifiez exactement les parties que vous aimeriez capturer.

Questions connexes