2010-10-28 5 views
1

J'ai petit problème avec un simple tokenizer regex:RegexpError: débordement de pile dans regexp matcher

def test_tokenizer_regex_limit 
    string = '<p>a</p>' * 400 
    tokens = string.scan(/(<\s*tag:.*?\/?>)|((?:[^<]|\<(?!\s*tag:.*?\/?>))+)/) 
end 

Fondamentalement, il passe par le texte et obtient des paires de [matched_tag, other_text]. Voici un exemple: http://rubular.com/r/f88JBjfzFh

Fonctionne correctement pour les petites séries. Si vous courez sous Ruby 1.8.7 il va exploser. 1.9.2 fonctionne bien.

Des idées pour simplifier/améliorer cela? Mon regex-fu est faible

+0

Je ne suis pas vraiment (x) html analyse cependant. Juste besoin de tokenize texte comme ceci: texte | | plus de texte | . En fait, il pourrait s'agir d'une chaîne comme celle-ci: '' Pas vraiment analysable. – Grocery

Répondre

0

Ceci est un peu plus simple mais pas beaucoup:

(<[^<]*:[^<]*>)|((?:[^<]|<[^:]*>)+) 

(.? < *> | [^ <>] +)

+0

un peu, mais pas vraiment. J'ai besoin de deux groupes de capture comme ça: (<.*?>) | ([^ <>] +) et c'est presque là. Mais! Il va correspondre «» dans le premier groupe. Je dois mettre des balises seulement de ce format tout le reste devrait être dans le deuxième groupe de capture. – Grocery

+0

J'ai mis à jour ma solution, mais ce n'est pas beaucoup mieux que ce que vous avez déjà. J'espère que tu trouveras ta réponse! – tinifni

Questions connexes