2010-01-29 5 views
3

i ont cette chaîneRuby Split avec regex - regex ne fait pas ce que je veux

string = "<p>para1</p><p>para2</p><p>para3</p>" 

Je veux diviser le texte para2, de sorte que je reçois ce

["<p>para1</p>", "<p>para3</p>"] 

Les prises est que parfois para2 pourrait ne pas être enveloppé dans p tags (et il pourrait y avoir des espaces optionnels en dehors du p et à l'intérieur). Je pensais que cela ferait:

string.split(/\s*(<p>)?\s*para2\s*(<\/p>)?\s*/) 

mais je reçois ceci:

["<p>para1</p>", "<p>", "</p>", "<p>para3</p>"] 

ce n'est pas tirer les balises de début et de fin p dans le modèle correspondant - ils doivent être éliminés dans le cadre du Divisé. expressions régulières de Ruby sont avides par défaut, donc je pensais qu'ils ballotés dans tous et, cela semble confirmer si je fais un gsub au lieu d'une scission.

string.gsub(/\s*(<p>)?\s*para2\s*(<\/p>)?\s*/, "XXX") 
=> "<p>para1</p>XXX<p>para3</p>" 

Ils sont tiré et obtenu débarrasser d'ici, mais pas sur la scission. Des idées quelqu'un?

merci, max

+2

Rappelez-vous, vous ne pouvez jamais vraiment analyser HTML avec regex. Si cette chaîne dépend de quelque manière que ce soit d'une entrée externe, utilisez un analyseur HTML comme hpricot ou nokogiri. – Matchu

Répondre

8

vos groupes Replace capture (…) avec des groupes non-capture (?:…):

/\s*(?:<p>)?\s*para2\s*(?:<\/p>)?\s*/ 
+1

Cette réponse est correcte. Lorsque vous divisez par une regex avec des groupes de capture, il place les captures dans le tableau, ce qui vous permet de réaliser des opérations de scannage/séparation plus complexes. – mckeed

+0

Nifty ... ne savait pas que nous avions ça dans Ruby! – btelles

+0

Merci Gumbo, ça fait l'affaire. Je n'avais jamais entendu parler de groupes qui ne capturaient pas avant, c'est un peu utile. –