2010-07-19 6 views
0

Ceci est la ligne mono sur les serrures linux (je suis en utilisant 2.6.4 VM distro sur le site officiel)Pourquoi est-Mono se bloque sur regex

var match = Regex.Match(sz, linkPattern); 

La chaîne est ce qui obtient le lien et la Titre. Lorsque le mono frappe cette ligne, il ne plante pas, lance une exception ou quoi que ce soit. En utilisant les tops je vois mono en utilisant 96% du CPU. Je ne sais pas combien de temps la chaîne est. Je suspecte son < 8kb (j'ai examiné une URL différente) et il a été quelques minutes depuis que j'ai couru le code ainsi quelque chose doit être cassé.

+3

Sérieusement. Vous devriez utiliser un analyseur. Je ne sais vraiment pas ce qui est si difficile à comprendre à propos de ce simple fait, que «comment faire l'analyse HTML avec regex» - questions doivent également être posées par des utilisateurs expérimentés ici. : - \ – Tomalak

+0

Est-ce une expression rationnelle valide? Que signifie \ b *? En outre, plus de données sur le problème pourrait aider. – Amnon

Répondre

2

"Trop de \b" a été ma première réaction. Mais vraiment:

\b signifie limite de mot. À mon avis, <\ba et <a devraient être identiques. Aussi, \b* signifierait donc "répétition optionnelle des limites de mots", ce qui semble plutôt confus.

Je suppose que je n'ai jamais utilisé \b à la place, et utilisé \s? ou \s* à la place.

Avez-vous essayé un autre moteur d'expression rationnelle (Perl, PHP) pour déterminer si le blocage est dû à Mono?

+0

Vous avez raison, le '\ b' dans' <\ ba' est inutile. Comme pour '\ b *', il semble que ce soit supposé être '\ s *': zéro ou plusieurs caractères d'espacement. –

+1

Je ne sais pas pourquoi j'ai écrit ça, c'était du vieux code mais \ b * était le problème et \ s * est la solution. –

1

Il y a quelques bogues dans l'implémentation de regex de Mono qui peuvent provoquer des recurrences infinies. La seule solution consiste probablement à réécrire votre modèle pour en faire une expression régulière plus simple, ou à ne pas utiliser d'expressions régulières pour cette tâche.

Vous voudrez peut-être également signaler un problème. Je pense qu'il y a un étudiant Google Summer of Code qui travaille actuellement sur le moteur d'expression régulière de Mono.