1
votes

Extraire la chaîne entre un ensemble de plusieurs limiteurs avec des groupes

Comme le titre l'indique, j'ai une chaîne et je souhaite en extraire des données.

Voici ma chaîne:

Pattern p = Pattern.compile("\\|(.*?)\\|");
    Matcher m = p.matcher(text);
    while(m.find())
    {
        for(int i = 1; i< 10; i++) {
        test = m.group(i); 
        System.out.println(test);
        }
    }

et je veux extraire toutes les données entre les tubes: tab_PRO, 1, 1 ... et ainsi de suite . J'ai essayé:

text = "|tab_PRO|1|1|#tRecordType#||0|tab_PRO|";

et avec cela, j'obtiens le premier groupe qui est tab_PRO. Mais j'obtiens aussi une erreur

java.lang.IndexOutOfBoundsException: Aucun groupe 2

Maintenant, je ne comprenais probablement pas très bien le fonctionnement des groupes, mais je pensais qu'avec cela, je pourrais obtenir les données restantes dont j'ai besoin. Je n'arrive pas à comprendre ce qui me manque.

Merci d'avance


2 commentaires

Avez-vous essayé String.split () ?


vous pouvez utiliser la méthode substring ou split pour extraire la partie requise de votre chaîne.


3 Réponses :


1
votes

Essayez d'utiliser .split () ou .substring()


0 commentaires

3
votes

Utilisez String.split () . Tenez compte du fait qu'il attend une expression régulière comme argument, et que | est un opérande d'expression régulière réservé, vous devrez donc l'échapper avec un \ . Donc, faites-en deux \ pour que \ | ne soit pas interprété comme si vous utilisez une séquence d'échappement - invalide - pour le | caractère:

String text = "|tab_PRO|1|1|#tRecordType#||0|tab_PRO|";
Pattern p = Pattern.compile("\\|([^\\|]*)");
Matcher m = p.matcher(text);
while(m.find()){
    System.out.println(m.group(1));
}

Le voir fonctionner ici: https://ideone.com/WibjUm

Si vous souhaitez utiliser votre regex approche, vous devrez regrouper et capturer chaque répétition de caractères après chaque | et les restreindre à n'importe quoi sauf | , éventuellement en utilisant une expression régulière comme \\ | ([^ \\ |] *) .

Dans votre boucle, vous parcourez m.find () et utilisez simplement le groupe de capture 1 car c'est le seul groupe que chaque correspondance aura.

String[] parts = text.split("\\|");

https://ideone.com/RNjZRQ


0 commentaires

0
votes

Comme mentionné dans les commentaires, cela est plus facile avec String.split .

Quant à votre propre code, vous utilisez inutilement la boucle interne, ce qui conduit à cette exception. Vous n'avez qu'un seul groupe, mais la boucle for vous amènera à interroger plusieurs groupes. Votre boucle doit être aussi simple que:

tab_PRO
1
1
#tRecordType#

0
tab_PRO

Et cela s'imprime

Pattern p = Pattern.compile("(?<=\\|)(.*?)\\|");
Matcher m = p.matcher(text);
while (m.find()) {
    String test = m.group(1);
    System.out.println(test);
}

Notez que j'ai dû utiliser un look- derrière l'assertion dans votre regex.


0 commentaires