2010-02-11 20 views
3

Est-il possible/pratique de construire une expression régulière unique qui correspond à des données hiérarchiques?expression regex hiérarchique

Par exemple:

<h1>Action</h1> 
    <h2>Title1</h2><div>data1</div> 
    <h2>Title2</h2><div>data2</div> 
<h1>Adventure</h1> 
    <h2>Title3</h2><div>data3</div> 

Je voudrais finir avec des allumettes.

"Action", "Title1", "data1" 
"Action", "Title2", "data2" 
"Adventure", "Title3", "data3" 

Comme je vois cela nécessiterait de savoir qu'il existe une structure hiérarchique en jeu ici et si je code le modèle pour capturer le H1, il correspond uniquement à la première entrée de cette hiérarchie. Si je ne code pas pour H1 alors je ne peux pas le capturer. Je me demandais s'il y avait des trucs spéciaux que j'emploie pour résoudre cela.

Ceci est un projet .NET.

+0

Dans quelle langue? Regex n'est pas une langue. Il a beaucoup de dialectes différents, dont certains soutiennent ce que vous voulez, et d'autres pas. La plupart ne le font pas. –

+1

Ce n'est pas un bon endroit pour utiliser des expressions régulières, mais un analyseur HTML; En fonction de votre plateforme, nous pouvons en suggérer une bonne. S'il vous plaît modifier votre question et retag il. –

+1

De l'expérience des expressions régulières peuvent être très efficaces pour traiter le HTML dans la nature: D accordé son pas élégant - mais son efficacité pour le temps qu'il faut. –

Répondre

5

La solution est de ne pas utiliser d'expressions régulières. Ils ne sont pas assez puissants pour ce genre de chose.

Ce que vous voulez est un parser - comme il semble que vous essayez de faire correspondre HTML, il ya beaucoup de choix.

+1

@snives yeh en fonction de la langue - antlr/lex-yacc/spirit ferait l'affaire.Mettez ce commentaire ici pour pouvoir les google. –

+0

D'accord, belle réponse succincte. –

+0

Intéressant, je vais vérifier cela, merci. – Snives

0

Regex ne fonctionne pas pour ce type de données. Ce n'est pas régulier, en soi.

Vous devez utiliser un analyseur XML pour cela.

2

Il est généralement considéré comme une mauvaise pratique de tenter d'analyser HTML/XML avec RegEx, précisément parce que c'est hiérarchique. Vous POUVEZ utiliser une fonction récursive pour le faire, mais une meilleure solution dans ce cas est d'utiliser un vrai analyseur XML. Je ne pourrais pas vous donner de meilleurs conseils sans connaître la plate-forme que vous utilisez.

EDIT: Regex est également très lent, ce qui est une autre raison pour laquelle il est mauvais pour le traitement du HTML; Cependant, je ne sais pas si un processeur XML/DOM est susceptible d'être plus rapide car il est susceptible d'utiliser beaucoup plus de mémoire.

Si vous voulez simplement des données d'un document simple comme vous l'avez démontré, et/ou si vous voulez construire vous-même une solution, ce n'est pas si difficile à faire. Créez simplement un processeur de flux basé sur l'état, simple et récursif, qui recherche les balises et transmet le contenu au niveau récursif suivant.

Par exemple:

- In a recursive function, seek out a "<" character. 
- Now find a ">" character. 
- Preserve everything you find until the next "<" character. 
- Find a ">" character. 
- Pass whatever you found between those tags into the recursive function. 

Vous devriez travailler erreur vous vérifier, mais est juste au moment où il n'y a rien d'autre à trouver le cas de base (lorsque vous revenez au niveau précédent).

Peut-être que cela aide, peut-être que non. Bonne chance à toi.