0 votes

expression régulière et échappement

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 .

1voto

serg Points 43893

Vous avez besoin de ce que l'on appelle le "Negative Lookbehind". Pour sélectionner tous les % non précédé de \ :

(?<!\\)% (expression pure de type regex)

pour l'utiliser en Java, il faut ajouter des masques :

string.replaceAll("(?<!\\\\)%", "*");

1voto

David Gelhar Points 20703

Notez également que vous n'échappez pas suffisamment vos backslashes dans certains de vos tests assert. Voir la section intitulée "Expressions régulières, chaînes littérales et barres obliques inverses" dans http://www.regular-expressions.info/java.html

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