28 votes

Regex avec -, : :, ( et )

Je dois diviser la chaîne de caractères

(age-is-25::OR::last_name-is-qa6)::AND: :(age-is-20::OR::first_name-contains-test)

sur

string[0] = (age-is-25::OR::last_name-is-qa6)

string[1] = AND

string[2] = (age-is-20::OR::first_name-contains-test)

J'ai essayé d'écrire tant d'expressions regex, mais rien ne fonctionne comme prévu.

En utilisant l'expression rationnelle suivante, Matcher.groupCount() renvoie 2 mais l'affectation des résultats à une liste de tableaux renvoie des éléments nuls.

Pattern pattern = Pattern.compile("( \\ ): :)?|(: : \\ () ?") ;

J'ai essayé de le diviser en utilisant ): : ou : :(.

Je sais que le regex semble trop stupide, mais étant un débutant, c'est le mieux que j'ai pu écrire.

35voto

dacwe Points 26160

Vous pouvez utiliser un lookahead et un lookbehind positifs pour faire correspondre la première et la dernière parenthèse.

String str = "(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)";

for (String s : str.split("(?<=\\))::|::(?=\\()"))
    System.out.println(s);

Sorties :

(age-is-25::OR::last_name-is-qa6)
AND
(age-is-20::OR::first_name-contains-test)

Une remarque cependant : il semble que vous analysiez une sorte de langage récursif. Les expressions régulières ne sont pas adaptées à ce type d'analyse. Si vous effectuez une analyse syntaxique avancée, je vous recommande d'examiner d'autres méthodes d'analyse syntaxique.

1voto

Bananeweizen Points 12524

Il me semble qu'une grande partie de votre stress provient de la nécessité d'échapper les caractères spéciaux dans votre terme de recherche. Je vous recommande vivement de ne pas faire l'échappement manuel des caractères spéciaux, mais d'utiliser plutôt Pattern.quote(...) pour l'évasion.

1voto

chaitu Points 399

Cela devrait fonctionner

 "(?<=\\))::|::(?=\\()"

-1voto

ManojGumber Points 1615
textString.split("\\)::|::\\(") 

devrait fonctionner.

-1voto

Adam Merrifield Points 5112

Cela devrait fonctionner pour vous.

\)::|::\(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X