|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Inscription : janvier 2005 Messages : 88 ![]() |
Bonjour à tous! Je vais illustrer mon problème par un exemple (avec des parethèses, mais ça pourrai aussi être des balises).
Texte: 6*(1+(4-2)/(sin(x)+(4+7)))-9*(2^(3-2)+1) But: Rechercher les groupes de paranthèse: c'est-à-dire qu'il me donne: 1+(4-2)/(sin(x)+(4+7)) et 2^(3-2)+1 C'est à dire que dès qu'il voit l'ouverture d'une paranthèse il va chercher celle qui se ferme (et qui lui corresond) et retourne le contenu. Il y a-t-il un moyen de faire ça avec des regexp ou le mieux et de programmer le truc sans regexp? Merci d'avance! PS: Si je suis pas clair, n'hésitez pas à me le faire savoir... |
|
|
00
|
|
|
#2 | |
|
Membre habitué
![]() Inscription : décembre 2006 Messages : 109 ![]() |
Citation:
bon, j'ai l'impression de t'apporter + de questions que de réponses... si tu as des questions supplémentaires, n'hésites pas, mes neurones déficiantes arriveront peut-être à formuler quelque chose d'intelligent. ouais, aussi bien trouver la page sur php.net... http://www.php.net/manual/fr/referen...ern.syntax.php vers le bas sous "masques récursifs" tu as des explications et la regex est bien là '#\( ( (?>[^()]+) | (?R) )* \)#x' et elle a une drôle de tête... pour capturer en \\1 sans la première parenthèse ouvrante et la dernière parenthèse fermante, tu peux la transformer en '#\( ( (?: (?>[^()]+) | (?R) )* ) \)#x' et elle a toujours une drôle de tête, m'enfin ça vient de la doc officielle. l'option x permet d'ajouter des espaces pour aérer l'expression, mais en même temps elle enlève la possibilité d'utiliser l'espace comme pattern... et c'est souvant pratique l'espace, dans du html notamment. (?>...) est un masque unique, un genre d'ancrage dans le vide, dans ce cas si (?>[^()]+) ne sortira pas du masque unique tant et aussi longtemps qu'il n'y aura pas de caractère ( ou ) de rencontré dans la chaine source. en théorie c'est supposé accélérer les temps de traitement, dans la pratique mes tests m'ont plutôt donner de sévève ralentissements. |(?R) est la récursive, qui répétera du pattern précédent (?>...) jusqu'à ce qui succède (?R). toutes les formes récursives doivent en fait être vues comme des sous-routines. ici la particularité de |(?R) est d'être un genre de do-while... et le do-while ce fait de \( à \)... des questions? |
|
|
|
00
|
|
|
#3 | |||||
|
En attente de confirmation mail
![]() Inscription : juin 2002 Messages : 6 164 ![]() |
Pour l'idée de faire sans voilà ce que je vous propose :
Code :
Code X :
Citation:
|
|||||
|
|
00
|
|
|
#4 | ||
|
Membre à l'essai
![]() Inscription : janvier 2005 Messages : 88 ![]() |
merci pour a solution Regexp. C'est exactement ce que je cherchais (j'ai pas encre testé, mais ça devrait fonctionner au poil).
EDIT: Bon je viens de tester et ça marche pas sous Python voila le code python (pour d'autre eventuelles interessé): Code :
|
||
|
|
00
|
|
|
#5 | |
|
Membre habitué
![]() Inscription : décembre 2006 Messages : 109 ![]() |
Citation:
|
|
|
|
00
|
|
|
#6 |
|
Membre chevronné
![]() Étudiant Inscription : août 2005 Messages : 632 ![]() |
Ne cherche pas à le faire en 1 expression régulière, ce n'est pas possible. Il te faut une fonction (Il te faudrait une Pile pour le faire simplement donc un simple tableau suffit)
|
|
|
00
|
|
|
#7 | |
|
Membre à l'essai
![]() Inscription : janvier 2005 Messages : 88 ![]() |
ben une regexp reste une regexp, donc préciser que c'était pour python n'aurait pas changer grand chose (mais je m'aprecois du contraire...). De plus je fais aussi du php et cette fonction m'intressait de toute façon. Donc ton tuyau n'a pas été si inutile que ça; merci d'ailleur pour le tuyau.
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com