2013-03-06 4 views
1

entrée est quelque chose comme ceci:Extrait plus Cordes avec regex dans Android

String text = "{\"definitions\":[{\"id\":\"com.sample.evaluationa\",\"name\":\"Evaluationa\",\"vers}{\"id\":\"com.sample.evaluationb\",\"name\":\"Evaluationb\",\"vers}"; 

Et quelques citations pour le rendre plus transparent

String definitions = "{\"definitions\":["; 
String id = "{\"id\":\""; 
String name = "\",\"name\":\""; 
String rest = "\",\"vers}"; 

Mon expression régulière ressemble alors à ceci:

Pattern pattern = Pattern.compile((Pattern.quote(definitions)) +"("+ (Pattern.quote(id)) +"(.+)" +(Pattern.quote(name))+"(.+)"+(Pattern.quote(rest))+")*"); 

Je cherche des ID (com.sample.evaluation)

Matcher regexMatcher = pattern.matcher(text); 
    while (regexMatcher.find()) { 
     title = regexMatcher.group(2); 
     System.out.println(title); 
     System.out.println("The pattern is " + pattern.pattern()); 
    } 

Ma sortie ressemble à ceci:

com.sample.evaluationa","name":"Evaluationa","vers}{"id":"com.sample.evaluationb 
The pattern is \Q{"definitions":[\E(\Q{"id":"\E(.+)\Q","name":"\E(.+)\Q","vers}\E)* 

Mais je veux:

com.sample.evaluationacom.sample.evluationb 

Et ce qui est aussi intéressant, mais pas de la bonne façon, après avoir changé de groupe ciblé dans le cycle

title = regexMatcher.group(2); 

Je reçois juste (et bien sûr la ligne de motif)

Evaluationb 
+4

Je voudrais vraiment recommande d'utiliser un analyseur JSON. –

+1

Sérieusement, utilisez quelque chose comme Jackson. Le chemin que vous prenez est comme construire une maison avec des cuillères. – lmortenson

+0

Dans ce que vous seriez fourchu. –

Répondre

0

Vous pouvez gérer cette chaîne dans votre java, il suffit de télécharger Apache commons lang bibliothèque et collez le fichier commons-lang3-3.1.jar à vos libs dossier

Et l'utiliser comme ceci

String formatedjsonstring=StringEscapeUtils.unescapeJava(yourjsonstring); 

Ne fais pas les choses compliquées ..Utilisez cette bibliothèque qui automatiquement Unescape les caractères

Après avoir java échapper les caractères créer JSON objet comme celui-ci

JSONObject obj=new JSONObject(formatedjsonstring); 
JSONArray jsonArray=obj.getJSONArray("definitions"); 

que d'utiliser pour la boucle pour analyser les objets JSON

for(int i=0;i<jsonArray.length();i++) 
{ 
JSONObject obj=jsonArray.getJSONObject(i); 
String id=obj.getString("id"); 
} 
1

.+ signifie à caractères infinies et le moteur regex est par défaut gourmand il correspondra autant de caractères que possible.

Il serait préférable de définir des classes de caractères que vous pouvez vous attendre là:
[a-z\.]+ pour id et [A-Z][a-z]+ pour name
ceux qui travailleront par eux-mêmes parce que quand frapper le \ le moteur de regex s'arrêtera \ ne fait pas partie de la dernière classe

Si vous pour une raison quelconque à utiliser .+ mais arrêter le plus tôt possible ajouter un ? après il passe à paresseux comportement. (Par exemple. .+?)