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
3 Réponses :
Essayez d'utiliser .split () ou .substring()
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("\\|");
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.
Avez-vous essayé
String.split ()?vous pouvez utiliser la méthode substring ou split pour extraire la partie requise de votre chaîne.