2009-09-16 11 views
2

Existe-t-il une expression régulière correspondant au contenu entre accolades? Par exemple avec les éléments suivants:expression régulière pour le contenu entre accolades

d = {'key': {'a': [1,2,3]}} 

je voudrais correspondre { 'key': { 'a': [1,2,3]}} { et 'a': [1,2 , 3]}, mais pas { 'clé': { 'a': [1,2,3]}

+1

Seulement, je pense, en Perl 5.10 expressions régulières, et non trivialement même alors (http://perldoc.perl.org/perlre.html#Extended-Patterns). –

Répondre

4

Dans les expressions régulières classiques, cela est impossible - DFA ne peut pas analyser des paires imbriquées.

Il existe des façons de le faire avec des expressions régulières étendues, telles que les expressions récursives autorisées dans certains moteurs d'expressions rationnelles (telles que Perl regex), mais elles ne sont pas toujours jolies. (trop php fourni la version Perl. /\{(?:[^{}]+|(?R))*\}/ avec l'option (?R) étant le match récursive)

Vous n'êtes pas forcément besoin d'regex pour faire ce genre de chose cependant. Vous pourriez le faire simplement en parcourant la liste et en gardant une pile d'accolades ouvertes (et à quelle position ils ont été vus). Ensuite, chaque fois que vous voyez une accolade ouverte, vous poussez sa position sur la pile, et chaque fois que vous voyez une accolade proche, vous faites sortir l'accolade ouverte la plus récemment de la pile et utilisez sa position plus la position actuelle comme limites pour une sous-chaîne qui devient l'un de vos matchs. Répétez jusqu'à ce que vous atteigniez la fin de la chaîne.

+0

marcher à travers - oui, c'est ma solution actuelle. Je ne savais pas si c'était possible avec des RE réguliers. – hoju

+0

voir aussi http://stackoverflow.com/questions/968919/when-not-to-use-regex-in-c-or-java-c-etc –

0

Les expressions régulières ne peuvent pas gérer l'imbrication, il n'y a donc pas d'expression régulière qui fonctionnera dans le cas général.

Si vous pouvez limiter la profondeur d'imbrication maximale, vous pouvez probablement construire une expression qui vérifie explicitement tous les niveaux possibles d'imbrication. En général, vous utiliserez probablement une sorte de framework d'analyseur.

+1

Il existe ** des variantes qui autorisent l'imbrication arbitraire. –

0

La bibliothèque regex PCRE peut le faire en utilisant récursion:

/\{(?:[^{}]+|(?R))*\}/ 
1

Il est assez simple, mais il trouve un match :)

{'key': {'\w+': \[[\w,]*\w\]}} 
+0

malheureusement l'exemple que j'ai donné était une version simplifiée des données réelles que j'ai affaire avec ... – hoju

Questions connexes