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.