Désolé si cette question a déjà été posée, ma recherche a donné lieu à de nombreux messages hors sujet.
J'essaie de convertir les caractères génériques d'une chaîne de recherche définie par l'utilisateur (le caractère générique est "*") en caractères génériques postgresql comme "%".
J'aimerais gérer l'échappement de manière à ce que "%" => "\%"
y "\*" => "*"
Je sais que je pourrais remplacer \*
par quelque chose d'autre avant de remplacer *
et de le remettre en place, mais je préférerais ne pas le faire et ne convertir que des *
en utilisant un modèle qui le sélectionne lorsqu'il n'est pas précédé d'une \
.
String convertWildcard(String like)
{
like = like.replaceAll("%", "\\%");
like = like.replaceAll("\\*", "%");
return like;
}
Assert.assertEquals("%", convertWildcard("*"));
Assert.assertEquals("\\%", convertWildcard("%"));
Assert.assertEquals("*", convertWildcard("\\*")); // FAIL
Assert.assertEquals("a%b", convertWildcard("a*b"));
Assert.assertEquals("a\\%b", convertWildcard("a%b"));
Assert.assertEquals("a*b", convertWildcard("a\\*b")); // FAIL
Les idées sont les bienvenues.
EDITAR
pour clarifier,
Je veux une méthode qui permette d'obtenir 1 ou plusieurs String.replaceAll
pour convertir une chaîne de caractères de manière à ce que
- les occurrences de
%
devenir\%
, - ocurrances de
*
devenir%
et - les occurrences de
\*
devenir*
.
la meilleure réponse utilisera le moins d'appels pour String.replaceAll
.