2010-02-25 6 views
2

Ma question est presque identique à une entrée antérieure que j'ai trouvée ici mais pas tout à fait.Textparsing et fractionnement du texte incluant/excluant les guillemets

J'ai besoin d'analyser un fichier texte où les données sont structurées de la manière suivante: Chaque élément du fichier commence par un # suivi du libellé. Les champs du message sont séparés par un ou plusieurs espaces.

Voici la partie avec laquelle je rencontre un problème. Chaque zone peut être entourée de guillemets ou non, elle n'est obligatoire que si les données contiennent des espaces. Donc, ce que je veux, c'est une regex qui se sépare par espace mais pas si cet espace est dans une citation.

Pour l'instant, j'utilise une expression rationnelle distincte pour chaque étiquette, mais il serait beaucoup plus efficace de la découper immédiatement en lisant le fichier. En ce qui concerne l'exemple de compte ci-dessous (^#[A-z]+)\s([0-9]+)\s(.+)

Exemple de données

#ACCOUNT 7059 "Misc. travelexpenses" 
#ADRESS "M. Jackson" "somewhere over the rainbow" WI53233-1704 555-12345 
+0

Pourrait-il y avoir des guillemets incorporés dans les chaînes entre guillemets, et si oui, comment vont-ils être échappés, ie "Deux par quatre (2" "x4" ")" ou "" Deux par quatre (2 \ "x4 \ ")" "? –

Répondre

0

Vous pouvez utiliser un « OU » construire, pour définir les formes possibles des champs. Comme

([A-z]+|"[^"]+") 

les deux matchs Kring et "M. Kring".

Edit: Alors, pour obtenir tous vos champs et l'étiquette dans les documents ci-dessus, vous pouvez utiliser

(?:^#|\s+)([^"#\s]+|"[^"]+") 

http://gskinner.com/RegExr/ est une bonne façon de tester les expressions régulières.

+0

Utilisez '\ S +' au lieu de '[A-z] +' – Amarghosh

+0

\ S frappe les caractères non-blancs, n'est-ce pas? Eh bien .. en regardant les données ci-dessus, c'est peut-être ce que Kring cherchait. Je voulais juste montrer comment utiliser le ou construire. – Jens

+0

Mais que faire si je veux exclure un match? Dans ce cas, trouvez tous les espaces sauf ceux entre guillemets. Ceci est une question: Divise en 4 parties Ceci est "une question": Divise en 3 parties –

Questions connexes