Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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$
L'analyse de l'expression ne fini jamais, la CPU est utilisée à 100%...
Une idée ?
-- Delf
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" <strafer@online.fr.nospam> a écrit dans le message de
news:435349e8$1$4329$626a54ce@news.free.fr...
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$
L'analyse de l'expression ne fini jamais, la CPU est utilisée à 100%...
Une idée ?
-- Delf
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+)*$
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.
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+)*$
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
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.
à 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.