2010-09-23 6 views
1

J'ai une chaîne qui contient trois occurrences du mot 'TEST'. Chacun de ces mots est suivi de^et je dois vérifier si le contenu entre 2 et et 3e occurrences de^est vide, s'il est vide/vide plus loin pour voir si le contenu entre les 5ème et 6ème occurrences du^est « »java regex search remplace le numéro

Si elle est « », remplacez à être vide/vide

Je dois répéter ce contrôle logique à chaque fois que mot TEST se trouve.

Exemple:

chaîne existante:

aaaa^ 
TEST^x^^y^z^""^cccc^bbb^ 
bbbb^ 
TEST^p^^q^r^""^lll^mmm^ 
TEST^P^X^q^n^""^hhh^ttt^ 

chaîne attendue:

aaaa^ 
TEST^x^^y^z^^cccc^bbb^ 
bbbb^ 
TEST^p^^q^r^^lll^mmm^ 
TEST^NOT EMPTY THUS IGNORE^X^q^n^""^hhh^ttt^ 

Comment puis-je faire? Toute aide est grandement appréciée.

Répondre

0
String resultString = subjectString.replaceAll("(TEST\\^[^^]*\\^\\^[^^]*\\^[^^]*\\^)\"\"\^", "$1"); 

Explication:

(  # start capturing group 
TEST # match TEST 
\^  # match^(no. 1) 
[^^]* # match 0 or more non-^ characters 
\^\^ # match ^^ (no. 2 and 3) 
[^^]* # match 0 or more non-^ characters 
\^  # match^(no. 4) 
[^^]* # match 0 or more non-^ characters 
\^  # match^(no. 5) 
)  # end capturing group 
""  # match "" 
\^  # match^(no. 6) 
+0

Merci! ... Je l'ai essayé. Malheureusement, rien n'est changé dans la chaîne modifiée. J'ai essayé votre code avec ceci: –

+0

TEST^x ^^ y^z^""^cccc^bbb^ –

+0

et la chaîne résultante est toujours comme TEST^x ^^ y^z^""^cccc^bbb^ –

0

^ est le séparateur, de sorte que vous pouvez diviser la chaîne en jetons:

String[] tokens = text.split("\\^", -1); 

recherche, puis à travers ce tableau de jetons à la recherche d'TEST, en appliquant tout logique dont vous avez besoin, en mettant à jour les jetons au besoin.

Enfin, la sortie de la liste actualisée des jetons, séparés par ^:

for (int i=0; i<tokens.length; i++) { 
    if (i > 0) { 
     System.out.print("^"); 
    } 
    System.out.print(tokens[i]); 
} 
System.out.println(); 

En procédant ainsi, l'algorithme vous implémentez sera beaucoup plus claire.

0

La réponse de Tim est presque correcte. Cependant, il peut y avoir un cas où, après "", il n'y a pas de 6ème mais un autre caractère. La correction est

String resultString = subjectString.replaceAll("(TEST\\^[^^]*\\^\\^[^^]*\\^[^^]*\\^)\"\"\\^", "$1^"); 
+0

Peu importe ... l'ai eu pour travailler pour la chaîne avec ^. Merci! Mais j'ai une autre exigence où la chaîne est séparée avec | au lieu de ^.Dans de tels cas, cela ne fonctionne pas. Est | un caractère spécial dans regex? Comment faire ce travail: TEST | x || y | z | "" | cccc | bbb | La sortie attendue doit être TEST | x || y | z || cccc | bbb |. Merci d'avance. –

+0

k. Je l'ai eu à travailler pour | en l'esacapant - \\ | –

+0

Pour un autre cas d'utilisation de ma tâche actuelle - L'expression regex que vous avez utilisée peut-elle être utilisée pour remplacer ceci? - "" l'exemple ci-dessus lorsque le contenu se situe entre le 2e et le 3e | n'est pas vide. –