2017-10-13 2 views
0

Je dois capturer en perl tout entre {et}, {dans une chaîne. Les occurrences peuvent exister de 0 à un nombre fini.regex capture tout entre les caractères spéciaux

J'ai essayé d'utiliser:

my @tmp; 
my $extract = "";     
$extract = $1 if $json =~ /\{([^}]+)\}/g; 
push @tmp, $extract; 

Où JSON $ est la chaîne où je dois extraire le contenu.

Voici un exemple de deux articles de $ JSON:

{ "id": "AAAAAAAAAA", "texte": "AAAAAAAAAA", "icône": "jstree-dossier", "li_attr": {"id": "AAAAAAAAAA"}, "a_attr": {"href": "#", "id": "AAAAAAAAAA_anchor"}, "état": {"chargé": vrai, "ouvert" : true, "selected": false, "disabled": false}, "data": {"Taginfo": "default", "Type": "", "Measure": "", "Echelle": "default" , "Filtre": "", "Concept": "default", "Uso": "default", "Uso2": "default", "Parciales": 1}, "parent": "#"}, {" id ":" BBBBBBBBBBBBB "," texte ":" BBBBBBBBBBBBB "," icône ":" jstree-dossier "," li_attr ": {" id ":" BBBBBBBBBBBBBB "}," a_attr ": {" href ":" AAAAAAAAAA "," id ":" BBBBBBBBBBBBB_anchor "}," état ": {" chargé ": vrai," ouvert ": faux," sélectionné ": vrai," désactivé " ": false}," data ": {" Taginfo ":" BBBBBBBBBBBBBB "," Type ":" par défaut "," Mesurer ":" par défaut "," Echelle ":" 1000 "," Filtre ":" 1000 ", "Concept": "default", "Uso": "", "Uso2": "", "Parciales": 1}, "parent": "AAAAAAAAAA"}

En utilisant l'expression rationnelle ci-dessus, je Je ne reçois pas la bonne chaîne. à savoir: Dans la première occurrence doit être:

{ "id": "AAAAAAAAAA", "texte": "AAAAAAAAAA", "icône": "jstree-dossier", "li_attr": { "id ":" AAAAAAAAAA "}," a_attr ": {" href ":" # "," id ":" AAAAAAAAAA_anchor "}," état ": {" chargé ": vrai," ouvert ": vrai," sélectionné ": false, "disabled": false}, "data": {"Taginfo": "default", "Type": "", "Measure": "", "Echelle": "default", "Filtre": "" , "Concept": "default", "Uso": "default", "Uso2": "default", "Parciales": 1}, "parent": "#"}

, j'ai besoin capturer jusqu'au suivant:

},{ 

Ma question est comment ignorer terminer le groupe de capture avec}, {au lieu de simplement avec}?

Merci.

+3

Vous ne devriez vraiment pas inventer votre propre analyseur JSON. Il y en a déjà assez sur le CPAN. ;-) il semble cependant que le problème que vous essayez de résoudre est qu'il existe plusieurs objets json dans une variable. Il semble qu'ils soient délimités par des sauts de ligne. Pourquoi ne pas simplement diviser sur '/ \} \ n /'? – simbabque

+1

Ceci est un problème XY - donnez quelques exemples de données et ce que vous essayez d'extraire. Il est presque certainement beaucoup plus facile et plus propre d'utiliser un parseur JSON pour y parvenir. – Sobrique

+0

Je l'avais fait quand j'ai créé la question –

Répondre

2

vous avez réellement besoin d'utiliser un modèle correspondant récursive pour correspondre à la fermeture { .. } comme ceci:

\{(?:[^{}]+|(?0))*} 

RegEx Demo

Ici (?0) récursif tout le motif. Toutefois, si vous analysez une chaîne JSON valide, il est préférable d'utiliser l'analyseur JSON.