Comment puis-je extraire une chaîne entre les accolades correspondantes dans Perl?
Mon fichier d'entrée est comme ci-dessous :
HEADER
{ABC|*|DEF {GHI 0 1 0} {{Points {}}}}
{ABC|*|DEF {GHI 0 2 0} {{Points {}}}}
{ABC|*|XYZ:abc:def {GHI 0 22 0} {{Points {{F1 1.1} {F2 1.2} {F3 1.3} {F4 1.4}}}}}
{ABC|*|XYZ:ghi:jkl {JKL 0 372 0} {{Points {}}}}
{ABC|*|XYZ:mno:pqr {GHI 0 34 0} {{Points {}}}}
{
ABC|*|XYZ:abc:pqr {GHI 0 68 0}
{{Points {{F1 11.11} {F2 12.10} {F3 14.11} {F4 16.23}}}}
}
TRAILER
Je veux extraire le fichier dans un tableau comme ci-dessous :
$array[0] = "{ABC|*|DEF {GHI 0 1 0} {{Points {}}}}"
$array[1] = "{ABC|*|DEF {GHI 0 2 0} {{Points {}}}}"
$array[2] = "{ABC|*|XYZ:abc:def {GHI 0 22 0} {{Points {{F1 1.1} {F2 1.2} {F3 1.3} {F4 1.4}}}}}"
..
..
$array[5] = "{
ABC|*|XYZ:abc:pqr {GHI 0 68 0}
{{Points {{F1 11.11} {F2 12.10} {F3 14.11} {F4 16.23}}}}
}"
Ce qui signifie, j'ai besoin de correspondre à la première accolade d'ouverture avec son accolade de fermeture et d'en extraire la chaîne entre les deux.
J'ai vérifié le lien ci-dessous, mais cela ne s'applique pas à ma question.
Regex pour obtenir la chaîne entre accolades "{je veux ce qui est entre les accolades}"
Je suis en train d'essayer, mais aiderait vraiment si quelqu'un peut m'aider avec leur expertise ...
Merci
Sri ...
source d'informationauteur Srilesh
Vous devez vous connecter pour publier un commentaire.
Cela peut certainement être fait avec la regex au moins dans les versions récentes de Perl:
L'expression régulière correspond à une accolade bloc qui contient non accolades, ou une récursivité en lui-même (correspond accolades imbriquées)
Edit: le code ci-dessus fonctionne en Perl 5.10+, pour les versions antérieures à la récursivité est un peu plus détaillé:
Utilisation Texte::Équilibré
J'deuxième ysth la suggestion de l'utilisation de la
Text::Équilibré
module. En quelques lignes, vous êtes sur votre chemin.De SORTIE
Vous pouvez toujours compter accolades:
C'est vieux, plaine de style Perl (et moche, probablement).
Je ne pense pas que pure expressions régulières sont ce que vous voulez à utiliser, ici (à mon humble avis cela pourrait même ne pas être analysée à l'aide de regex).
Au lieu de cela, construire une petite analyseur, similaire à ce qui est indiqué ici: http://www.perlmonks.org/?node_id=308039
(voir la réponse par shotgunefx (Parson) sur 18 Nov 2003 à 18:29 UTC)
Mise à JOUR il semble qu'Il pourrait être faisable avec une regex, j'ai vu une référence à l'appariement des parenthèses imbriquées dans Mastering Regular Expressions (disponible sur Google Livres, et peut donc être cherché sur google si vous n'avez pas le livre - voir le Chapitre 5, section "Correspondance équilibré jeux de parenthèses")
Vous êtes beaucoup mieux à l'aide d'une machine d'état qu'une regex pour ce type d'analyse.
Les expressions régulières sont en fait assez mauvais pour la parenthèse. Selon la profondeur à laquelle vous voulez aller, vous pourriez écrire un plein de grammaire (qui est beaucoup plus facile qu'il n'y paraît!) pour Parse::RecDescent. Ou, si vous voulez juste pour obtenir les blocs, recherche par le biais de l'ouverture de '{' marques et de fermeture '}", et à seulement tenir compte de la façon dont la plupart sont ouverts à un moment donné.