OVH Cloud OVH Cloud

Expression reguliere qui boucle...

3 réponses
Avatar
Delf
Bonjour.

Voici une expression régulière :

@"^[a-z]+(([a-z0-9]*|[-])*[a-z0-9])*[.][a-z]+(([a-z0-9]*|[-])*[a-z0-9])*$"

Si j'entre :

aa-aa.aa-aaaaaaaaoooooooooooo.

L'analyse de l'expression ne fini jamais, la CPU est utilisée à 100%...

Une idée ?

--
Delf

3 réponses

Avatar
Ludovic SOEUR
Delf,

Votre expression régulière peut dans certains cas être TRES couteuse en
temps de calcul ce qui explique l'utilisation du CPU à 100%. En fait, elle
terminera bien mais dans un temps très long ou alors plantera s'il y a un
dépassement de capacité avant la fin.
Afin que vous compreniez mieux votre erreur dans la construction de votre
regex, regardez l'exemple suivant qui est une simplification extrême de
votre regex :

Prenez pour regex : (a+)*$
Prenez pour valeur : aaaaaaaaaaaaaaaaaaaaaaaaaaaab

Si vous essayez, vous verrez que le résultat sera long à atteindre, surtout
si vous augmentez le nombre de 'a' dans la chaine de valeur et votre CPU
sera bloqué à 100%. La regex demande à chercher toutes les séquences de 'a'
de taille variable qui étant répétées un nombre variable de fois 'matchent'.
Ensuite, avec cet ensemble, le moteur vérifiera que l'on se trouve en bout
de chaine. Ce n'est pas le cas ici car on a un 'b' en fin de chaine. Le
moteur va donc essayer toutes les combinaisons sans succès.
Par exemple : aaaa 3 fois, aaaa 4 fois, aa 10 fois, .....donc plus il y aura
de 'a' dans la chaine de valeur, plus le nombre de combinaisons est
important et plus la regex sera longue.

Votre regex procède exacement de la même façon. (([a-z0-9]*|[-])*[a-z0-9])*
va dans les suites ne contenant aucun tiret être interprétée comme
([a-z0-9]*[a-z0-9])* ce qui est l'équivalent de ([a-z0-9]+)* qui est
exactement ce que je vous ai décrit ci-dessus.

Il faut proscrire toutes les formes du genre (a+)*, qui peuvent être gérées
de façon plus pertinentes par du backtracking.

Cordialement,

Ludovic SOEUR.



"Delf" a écrit dans le message de
news:435349e8$1$4329$
Bonjour.

Voici une expression régulière :

@"^[a-z]+(([a-z0-9]*|[-])*[a-z0-9])*[.][a-z]+(([a-z0-9]*|[-])*[a-z0-9])*$"

Si j'entre :

aa-aa.aa-aaaaaaaaoooooooooooo.

L'analyse de l'expression ne fini jamais, la CPU est utilisée à 100%...

Une idée ?

--
Delf


Avatar
Ambassadeur Kosh
tout pareil que Ludovic.
par contre, si j'enleve le . à la fin de ton text, ça le fait direct.

à bien regarder, ton pattern est un gouffre à temps. donc c'est normal que
répondre non prenne ce temps la. déja, les |, ensuite, la formulation me
semble pas tres "réguliere".

ça, ça te convient pas ? je veux dire, dans le principe, apres, tu fais ta
sauce dessus.

^w+(-w+)*.w+(-w+)*$
Avatar
Delf
Ambassadeur Kosh wrote:

à bien regarder, ton pattern est un gouffre à temps. donc c'est normal que
répondre non prenne ce temps la. déja, les |, ensuite, la formulation me
semble pas tres "réguliere".



Vu le temps qu'elle prends... c'est sûr qu'elle n'est pas 'top' :)

Pour aller 'plus' vite, j'ai coupé le traitement en 2 parties.

ça, ça te convient pas ? je veux dire, dans le principe, apres, tu fais ta
sauce dessus.

^w+(-w+)*.w+(-w+)*$



Me para^t plus simple :)
Merci.

--
Delf