2010-12-05 75 views
0

Je suis un programmeur débutant essayant d'analyser un fichier HTML dans une esquisse de traitement. (Incidemment, si vous ne connaissez pas le traitement, il se compile en Java et utilise les mêmes fonctions regex). J'ai correctement capturé le fichier HTML en tant que chaîne unique en utilisant SimpleML. Les données que je suis en train de capturer provient d'une table, comme ceci:Aide avec regex dans une esquisse de traitement?

<th>Name</th> 
    <th>John F. Kennedy</th> 
    <th>Lyndon Johnson</th> 
    <th>Richard Nixon</th> 

etc.

Je veux analyser les noms des candidats dans un tableau (laissant tomber le « nom »).

donc j'ai essayé

candidates = match(rawString,"<th>.*</th>"); 

qui retourne toute la liste.

Alors j'ai essayé

candidates = match(rawString,"<th>.{1,50}</th>"); 

qui retourne seulement

<th>Name</th> 

La documentation de traitement dit:

S'il y a des groupes (spécifiés par des ensembles de parenthèses) dans l'expression rationnelle, alors le contenu de chacun sera retourné dans le tableau. L'élément [0] d'une correspondance d'expression rationnelle renvoie l'ensemble de la chaîne correspondante, et les groupes de correspondance commencent à l'élément [1] (le premier groupe est [1], le second [2], etc.).

Alors maintenant, j'ai essayé différentes combinaisons de groupes et quantificateurs, comme:

candidates = match(rawString,"(<th>.{1,50}</th>)*"); 

Mais il doit y avoir une pièce conceptuelle Je ne reçois pas, parce que rien ne fonctionne. On dirait que ça devrait être facile, non?

+0

contreventement anti-regex-et-html foule –

Répondre

1

Le traitement HTML avec une expression régulière n'est généralement pas une bonne idée, mais vous pourriez vous en sortir ici.

Votre problème semble avoir été que .* correspond à la cupidité, je. e. autant de caractères que possible, ce qui correspond à tout depuis le tout premier <th> jusqu'au tout dernier </th> dans votre chaîne.

Le rendant paresseux, je. e. dire le quantificateur pour correspondre le moins possible est une solution:

<th>.*?</th> 

fonctionnerait probablement.

Un peu plus stable et plus rapide au minimum: Dites-le moteur exactement ce qu'il est permis de faire correspondre, par exemple:

<th>[^<>]*</th> 

[^<>] signifie « tout caractère sauf crochets ».

Vous rencontrerez des problèmes si vous essayez de faire correspondre des structures imbriquées avec des expressions régulières. Cela peut être fait dans les saveurs modernes de regex, mais c'est très difficile à faire correctement. Ajoutez des commentaires et des chaînes de caractères HTML au mélange (qui pourrait contenir les délimiteurs que vous apportez) et vous êtes dans un monde de blessures.

+0

Ok, donc je reçois le sens de la communauté qui regex + HTML = problème. Alors, quelle serait une meilleure méthode? – James

1

Vous souhaitez probablement utiliser la méthode matchAll si vous prévoyez de faire correspondre votre expression plusieurs fois. match ne s'attend qu'à ce que votre motif corresponde une fois, de sorte que seul le premier résultat trouvé est renvoyé.

http://www.processing.org/reference/matchAll_.html

+0

Cela semble être le problème le plus important que rencontre James. –