2016-05-17 1 views
0

comment puis-je créer une regex pour analyser cette chaîne?Comment puis-je créer une regex pour analyser cette chaîne

"desc: random text string, sender: James, se-status: red, problem-field: I'm a problem field, I'm a problem field, action: runs, target: John, ta-status: blue, status-apply: red, lore: lore ipsum dolor sit amet" 

Je veux des groupes qui obtiennent des clés et des valeurs. S'il vous plaît noter que le "champ de problème" a des citations en elle. Les groupes doivent obtenir la clé, puis localiser la dernière virgule avant le nom de clé suivant.

Ceci est un exemple de chaîne. Les autres chaînes peuvent avoir des noms de champs différents, donc l'expression régulière ne doit pas correspondre à des noms de champs spécifiques tels que sender ou action.

groupes de résultats attendus:

1. "desc" 
2. "random text string" 
3. "sender" 
4. "James" 
5. "se-status" 
6. "red" 
7. "problem-field" 
8. "I'm a problem field, I'm a problem field" 
9: "action" 
10."runs" 
11."target" 
12."John" 
13."ta-status" 
14."blue" 
15."status-apply" 
16."red" 
17."lore" 
18."lore ipsum dolor sit amet" 

S'il vous plaît noter champ problème devrait être 1 résultat que

Cette question a commencé quand j'ai essayé d'améliorer ma réponse à cette question SO ici: JS: deserializing a string with a JSON-like structure

J'ai fait un classique for, mais l'utilisateur Redu a créé une réponse basée sur une regex. Pourtant je n'ai pas aimé parce que les noms de champs devaient être corrigés. J'ai donc essayé de créer une regex avec des groupes de capture qui reviennent pour vérifier la dernière virgule, mais j'ai rapidement découvert que mes compétences en regex ne vont pas si loin (encore). J'ai donc pensé en créant cette question afin que nous puissions apprendre avec les maîtres de regex là-bas.

+0

Voilà le défi. La clé est la chose entre la dernière virgule et: –

+0

L'espace double avant l'action est-il destiné? –

+0

non ... édité. Mais les espaces n'ont pas d'importance. –

Répondre

1

Cette regex pourrait vous aider:

([\w-]+): ([\w,\s']+)(?:,|$) 

Demo

Il capture toutes les clés/valeurs séparées par une :

+1

Espérons que votre champ de problème ne contient pas un ':' – Nick