2014-07-24 8 views
0

J'ai appris l'erreur de sérialisation ... maintenant je dois payer pour cela. Dans mon DB, j'ai les enregistrements où l'attribut de chaîne ressemble à ceci:Utilisation de REGEX pour analyser les données sérialisées

"---\n- '0'\n- Tent\n- '0'\n- '0'\n- Sleeping pad\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n"

est-il un moyen facile d'analyser uniquement les deux éléments à l'intérieur? Dans ce cas, les articles sont Tente et tapis de couchage, mais il faut noter que dans ces longues chaînes, il peut y avoir un certain nombre d'objets cachés ...

Pour votre information, c'était Ruby on Rails 4.

+0

quel est votre résultat attendu? L'entrée est la chaîne que vous avez fournie, la sortie est "Tapis de couchage de tente" ou quoi? – trainoasis

+0

Idéalement, je voudrais que la sortie soit 'Tente, Coussin de couchage, élément suivant, ainsi de suite 'afin que je puisse convertir en tableau et ensuite en lancer un enumerable. – james

Répondre

1

Ok désolé, pas le tonnerre de voler qui que ce soit, mais je ne sais pas littéralement RegEx du tout, donc je ne savais pas où la mettre la ligne de code. Je fini par utiliser un moyen pur rubis bien, juste:

long_string = "---\n- '0'\n- Tent\n- '0'\n- '0'\n- Sleeping pad\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n- '0'\n" 
new_array = long_string.split("\n- ") 
#mimic what the serialization function does, which is splitting up each of the items with the "\n- " thing 

new_array.select! { |t| ("A".."Z").include? t[0] } 
#select only elements of the newly created array where the first character is a capital letter, since it works out that all my items would start with a capital letter 

sortie dans ce cas serait => ["Tent", "Sleeping pad"]

0

Avec cette entrée, vous avez besoin de la chaîne suivante pour extraire ces mots

(?<=^|\\n-\s)([\p{L} ]+?)(?=\\n) 

Utilisez cette option si vous ne disposez pas de "paresseux".

(?<=^|\\n-\s)([a-zA-Z ]+?)(?=\\n) 
+0

Salut désolé, comment exactement je l'utilise? une fois que j'ai des "objets" en tant qu'objet? J'ai essayé de faire 'items.split ...' mais cela semblait nécessiter plus d'informations. Merci! – james

+1

Je ne sais pas sur Ruby regex, mais peut-être cela peut aider: http://regex101.com/r/rX5jU9/1 C'est presque la même que sa deuxième regex (sauf groupe de non-capture ajouté au début avec? :) et il travaux. Ne pas oublier de faire un match global. – trainoasis

+0

Oh - testé ici aussi, et mon regex édité trouve les deux mots http://rubular.com/ (mettre votre chaîne et mon regex édité) – trainoasis

Questions connexes