2009-06-25 7 views
1

je veux capturer tous les tags nommés 'STRONG' je peux utiliser <STRONG.*?</STRONG> cela fonctionne très bien, mais je ne veux pas capturer ces balises si les balises 'SPAN' viennent dans ces balises je veux quelque chose comme <STRONG.*(^(SPAN)).*?</STRONG> c'est le texte exempleje veux capturer tous les tags ne pas avoir un tag spécifique

<STRONG> For technical <SPAN id=PageBreak>101</SPAN> please</STRONG> 
<SPAN id=PageBreak type="4">56</SPAN><STRONG> visit</STRONG> 

je veux capturer la deuxième étiquette forte et non le premier

Répondre

3

Konrad a raison.

Mais dans le cas où vous ne se soucient pas de malheur imminent, vous pouvez essayer quelque chose comme

/<STRONG>\w+?<\/STRONG>/ 

qui ne tiendra pas compte des balises STRONG si elles enferment tout ce qui est pas un caractère de mot, comme le '<' de '<SPAN>' , mais échouera sans aucun doute pour tout ce qui sort de l'ordinaire ... pour en revenir à une tentative vouée à l'échec.

+0

"Mais au cas où vous ne vous souciez pas de la catastrophe imminente" - bien mis! : D – peterchen

+0

Je ne veux pas que les balises SPAN soient omises comme vous l'avez mentionné '<' si je veux que d'autres chaînes soient oubliées comment devrais-je répondre qu'en fait je veux oublier ces balises puissantes qui ont une chaîne spécifique – shabby

+0

@shabby Umm quoi? o_O – hometoast

5

Vous essayez d'analyser la structure HTML en utilisant une expression régulière, qui est voué à l'échec puisque le langage HTML n'est pas régulier (voir hierarchy of formal languages).

Utilisez un analyseur HTML à la place, par ex. le HTML Agility Pack. Voir également theseotherquestions.

+0

pas homme ... c'est juste un exemple ... im en utilisant un html bien formé ce n'est pas la partie de la question météo son bien formé ou pas juste fournir avec la réponse ....: P – shabby

+0

minable, non, même bien HTML formé n'est pas régulier. Une expression régulière n'est qu'une notation abrégée pour créer un automate à états finis. HTML ne peut pas être analysé par un automate à états finis. C'est un fait mathématique. – Svante

+0

Que ce soit bien formé ou pas n'a absolument aucune incidence sur ma réponse. La seule différence est que vous pouvez utiliser un analyseur XML au lieu d'un analyseur HTML si vous utilisez bien * XHTML * (ou HTML5 de style XML). De toute façon, les expressions régulières ne sont pas adaptées à la tâche. –

2

Ceci est un cas d'utilisation typique pour XPath. La requête pourrait être par exemple:

**/strong[not(child::span)]/text() 
+0

non je veux regex pas xpath – shabby

+0

Très bonne réponse. J'ai volontairement voulu poster le XPath moi-même mais je n'étais pas sûr de la syntaxe (et maintenant je vois que je l'aurais mal compris). –

+0

@Konrad: Merci @shabby: Bonne chance et peut-être vous éviter. – soulmerge

0

Si vous voulez juste savoir en général comment faire correspondre le texte qui ne contient pas une certaine séquence de caractères, voici la façon la plus commune:

Regex re = new Regex(@"<STRONG(?:(?!<SPAN).)*?</STRONG>", 
    RegexOptions.IgnoreCase | RegexOptions.Singleline); 
Questions connexes