2015-04-24 3 views
0

Je dois analyser une chaîne en 3 étapes. Seul le premier étage fonctionne, en 2 et 3 étapes. Matcher.groupCount() renvoie 0 - ce qui signifie qu'il n'a rien trouvé. Je testais mon regex dans un testeur en ligne et c'était très bien. Mais ici ça ne marche pas. Donc la question est peut-être que je manque quelque chose ou regex a une erreur dedans?Comment obtenir toutes les pièces correspondantes au modèle regex

String rawText = "ashjdajsdg:[requiredPartForFirstPattern]}asdassdasd"; 
Pattern firstPattern = Pattern.compile("(:\\[)(.*?)(\\]})"); 
List<String> firstList = parseContent(rawText, firstPattern); 

Après l'exécution Firstlist doit contenir uniquement une valeur (dans ce cas): "requiredPartForFirstPattern" (pourrait être l'un quelconque char ou toute séquence de char).

Maintenant, j'itérer toutes les valeurs dans le Firstlist et les vérifier avec 2 motifs:

Toutes les valeurs Firstlist auront la forme: "[someText1], [someText2], [someText3]".

String rawText = "[someText1],[someText2],[someText3]"; 
Pattern secondPattern = Pattern.compile("(\\[([^]]*)\\])"); 
List<String> secondList = parseContent(rawText, secondPattern); 

Après l'exécution secondList doit contenir ces valeurs (dans ce cas): "someText1", "someText2", "someText3".

Et enfin la troisième étape. Je itère toutes les valeurs dans secondList et les vérifie avec 3 pattern. Toutes les valeurs de secondList auront cette forme: "'someValue1', 'someValue2'".

String rawText = "'someValue1','someValue2'"; 
Pattern thirdPattern = Pattern.compile("('(.*?)')"); 
List<String> thirdList = parseContent(rawText, secondPattern); 

Après l'exécution secondList doit contenir ces valeurs (dans ce cas): "someValue1", "someValue2".

Ma méthode parseContent:

private List<String> parseContent(String content, Pattern pattern) { 
     List<String> matchedList = new LinkedList<>(); 

     Matcher matcher = pattern.matcher(content); 
     if (matcher.find()) { 
      for(int matchIndex = 0; matchIndex < matcher.groupCount(); ++matchIndex) { 
       matchedList.add(matcher.group(matchIndex)); 
      } 
     } 
     return matchedList; 
    } 
+0

Alors, quelle est la question/problème? – CKing

+0

Seul le premier étage fonctionne, en 2 et 3 étapes. Matcher.groupCount() renvoie 0 - ce qui signifie qu'il n'a rien trouvé. Je testais mon regex dans un testeur en ligne et c'était très bien. Mais ici ça ne marche pas. Donc la question est peut-être que je manque quelque chose ou regex a une erreur dedans? – sereGkaluv

+2

Pouvez-vous poster ceci dans le cadre de votre question? – CKing

Répondre

0

Vous devriez avoir tout (matcher.find()) au lieu d'une instruction if.

if (matcher.find()) { 
    for(int matchIndex = 0; matchIndex < matcher.groupCount(); ++matchIndex) { 
     matchedList.add(matcher.group(matchIndex)); 
    } 
} 

J'ai remplacé le code ci-dessus avec celui-ci:

while (matcher.find()) { 
    matchedList.add(matcher.group(1)); 
} 

fonctionne très bien, ty de l'aide.

+0

Vous pouvez [accepter cette réponse] (http://meta.stackexchange.com/a/5235/186652) si cela résout votre problème. – Pshemo

+0

Il dit que je peux le faire en 2 jours. – sereGkaluv