web-dev-qa-db-fra.com

Ajouter un caractère d'échappement "\" devant un caractère spécial pour une chaîne

J'ai une requête SQL simple où je vérifie si la requête correspond à l'un des champs que j'ai. J'utilise l'instruction LIKE pour cela. Un de mes champs peut comporter des caractères spéciaux, de même que la requête de recherche. Je cherche donc une solution où il me faut une évasion "\" devant le caractère spécial.

query = "hello+Search}query"

J'ai besoin de ce qui précède pour changer en 

query = "hello\+Search\}query"

Existe-t-il un moyen simple de procéder autrement qu'en recherchant chaque caractère spécial séparément et en ajoutant le "\". Parce que si je n'ai pas le caractère d'échappement, je vais recevoir le message d'erreur 

Java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0

Merci d'avance

6
Visahan

Décidez quels caractères spéciaux vous voulez échapper et appelez simplement

query.replace("}", "\\}")

Vous pouvez conserver tous les caractères spéciaux que vous autorisez dans un tableau, puis le réitérer et remplacer les occurrences comme dans l'exemple . Cette méthode remplace tous les caractères méta regex .

public String escapeMetaCharacters(String inputString){
    final String[] metaCharacters = {"\\","^","$","{","}","[","]","(",")",".","*","+","?","|","<",">","-","&","%"};

    for (int i = 0 ; i < metaCharacters.length ; i++){
        if(inputString.contains(metaCharacters[i])){
            inputString = inputString.replace(metaCharacters[i],"\\"+metaCharacters[i]);
        }
    }
    return inputString;
}

Vous pourriez l'utiliser comme query=escapeMetaCharacters(query); Ne pensez pas qu'une bibliothèque que vous trouveriez ferait autre chose que cela. Au mieux, il définit une liste complète de caractères spéciaux.

11
Laurentiu L.

Je devais faire la même chose en javascript. Je suis venu avec la solution ci-dessous. Je pense que cela pourrait aider quelqu'un.

function escapeSpecialCharacters(s){
 let arr = s.split('');
 arr = arr.map(function(d){
         return d.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\'+d)
       });
 let reg = new RegExp(arr.join('')); 
 return reg;
}

let newstring = escapeSpecialCharacters("hello+Search}query");
1
AMahajan

Vous devez utiliser \\ pour introduire un \ dans un littéral de chaîne; c’est-à-dire que vous devez échapper le \. (Une simple barre oblique inverse est utilisée pour introduire des caractères spéciaux dans une chaîne: par exemple, \t est un onglet.)

query = "hello\\+Search\\}query" est ce dont vous avez besoin.

1
Bathsheba