2010-03-15 6 views
0

Désolé, si cela a été demandé, ma recherche a soulevé de nombreux messages hors sujet. J'essaie de convertir des caractères génériques à partir d'une chaîne de recherche définie par l'utilisateur (le caractère générique est "*") à PostgreSQL comme le caractère générique "%".expression régulière et d'échappement

Je voudrais gérer des échappements afin que "%" => "\%" et "\*" => "*"

Je sais que je pourrais remplacer \* autre chose avant de remplacer * puis échanger en arrière, mais je préfère ne pas convertir et au lieu que * en utilisant un motif qui le sélectionne lorsqu'il n'est pas passé par \.

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 

Idées de bienvenue.

EDIT

Pour clarifier les choses,

Je veux une méthode qui fait 1 ou plusieurs String.replaceAll appels pour convertir une chaîne de telle sorte que

  • occurrences de % deviennent \%,
  • les occurrences de * deviennent % etLes occurrences \* deviennent *.

La meilleure réponse utilisera les moindres appels à String.replaceAll.

+1

Je ne comprends pas vraiment la question. Pourriez-vous préciser ce que vous essayez de faire et quel est le problème? – cletus

Répondre

1

Vous avez besoin de ce qu'on appelle "lookbehind négatif". Pour sélectionner tous % non précédé de \:

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

pour l'utiliser en Java vous devez ajouter un peu de masquage:

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

+0

merci serg, pour répondre à la question, votre réponse est 'like = like.replaceAll ("% "," \\% "); like = like.replaceAll ("(? pstanton

+0

en fait ce dernier replaceall devrait être 'like = like.replaceAll (" \\\\\ * * "," * ");' – pstanton

1

Notez également que vous aren » t échapper suffisamment à vos backslash dans certains de vos tests d'affirmation. 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

+0

ah, vous avez raison .. j'aurais dû exécuter cela avant de poster eh;) – pstanton