Ruby: Analyse d'une représentation de chaîne de tableaux imbriqués dans un Tableau?
Disons que j'ai eu de la chaîne
"[1,2,[3,4,[5,6]],7]"
Comment analyser que dans le tableau
[1,2,[3,4,[5,6]],7]
?
Des structures de nidification et les modèles sont tout à fait arbitraire dans mon cas d'utilisation.
Mon ad-hoc solution consiste à ajouter un espace après chaque période et en utilisant YAML.load
, mais j'aimerais avoir un propre si possible.
(Qui n'a pas besoin de bibliothèques externes si possible)
OriginalL'auteur Justin L. | 2010-12-18
Vous devez vous connecter pour publier un commentaire.
L'exemple particulier est analysé correctement à l'aide de
JSON
:Si cela ne fonctionne pas, vous pouvez essayer d'exécuter la chaîne à travers
eval
, mais vous devez vous assurer qu'aucun code ruby a été transmis, commeeval
pourrait être utilisé comme vulnérabilité d'injection.Edit: Voici un récursive simple, les regex en fonction de l'analyseur, pas de validation, pas testé, pas pour une utilisation en production, etc:
Pas sûr qu'entendez-vous par "pas propre", comme il est un appel de méthode pour l'analyse. Vous pouvez bien sûr écrire une simple regex analyseur de votre propre, ou de l'utilisation des outils dédiés, tels que treetop.rubyforge.org mais aucun de ceux est simple comme
JSON.parse
à mon humble avis.Oh, et
JSON
fait partie de Ruby lib, au moins en 1.9.x.Si vous avez un multi-type tableau comme
s = "['hello', 2, 'test', 5.0]"
, JSON échoue à analyser avec une erreur génériqueunexpected token at ...
. Cependant, YAML ne fonctionne pas comme indiqué dans @Arup répondre:YAML.load(s) => ["hello", 2, "test", 5.0]
.C'est parce que seul chaînes entre guillemets ne sont pas JSON valide.
OriginalL'auteur Mladen Jablanović
La même chose peut être fait à l'aide de Ruby standard libaray
YAML
comme ci-dessous :"['hello', 2, 'test', 5.0]"
, où JSON ne parvient pas à analyser.Ceci a l'avantage de ne pas lever une erreur si il y a un néant élément, mais elle renvoie le néant "nil", donc encore besoin de convertir un néant.
OriginalL'auteur Arup Rakshit
"Évidemment" la meilleure solution est d'écrire votre propre logiciel. [ Si vous aimez écrire des analyseurs, n'ont jamais fait avant et que vous voulez apprendre quelque chose de nouveau, ou veulent contrôler l'exacte grammaire ]
Je suis d'accord avec @MarkThomas trop...
OriginalL'auteur Nigel Thorne
Utiliser la fonction eval
L., Une "salle blanche" + "bac à sable" va vous protéger contre les maux de eval: stackoverflow.com/questions/2045324/... . À propos de tout ce qui est à gauche pour se protéger contre est le code qui s'exécute longtemps; Délai d'attente peut prendre soin de cela.
Ne pas le faire.
Veuillez ajouter une note de risques pour la sécurité de votre réponse si vous n'obtenez pas de downvotes. Quelques suggestions quant à la façon d'atténuer les risques seraient également utiles.
Je suis d'accord avec la nécessité d'ajouter un avertissement sur la sécurité, donc je downvoted dans le cas contraire, l'amende solution.
OriginalL'auteur jatin