Visahan
Visahan

Reputation: 1192

Add escape "\" in front of special character for a string

I have a simple SQL query where I check whether the query matches any of the fields I have. I'm using LIKE statement for this. One of my field can have special characters and so does the search query. So I'm looking for a solution where I need to an escape "\" in front of the special character.

query = "hello+Search}query"

I need the above to change to

query = "hello\+Search\}query"

Is there a simple way of doing this other than searching for each special character separately and adding the "\". Because if I don't have the escape character I will get the error message

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

Thanks in advance

Upvotes: 14

Views: 105488

Answers (6)

amer
amer

Reputation: 1672

The simple version ( without deprecated StringUtils.replaceAll ):

    String regex = "[\\[+\\]+:{}^~?\\\\/()><=\"!]";
    String query = "hello+Search}query";
    String replaceAll = query.replaceAll(regex, "\\\\$0");

Upvotes: 0

Tauseef Rahaman
Tauseef Rahaman

Reputation: 81

There is actually a better way of doing this in a sleek manner.

String REGEX = "[\\[+\\]+:{}^~?\\\\/()><=\"!]";

StringUtils.replaceAll(inputString, REGEX, "\\\\$0");

Upvotes: 8

Juliano Krieger
Juliano Krieger

Reputation: 21

If you want to use Java 8+ and Streams, you could do something like:

private String escapeSpecialCharacters(String input) {
    List<String> specialCharacters = Lists.newArrayList("\\","^","$","{","}","[","]","(",")",".","*","+","?","|","<",">","-","&","%");
    return Arrays.stream(input.split("")).map((c) -> {
                if (specialCharacters.contains(c)) return "\\" + c;
                else return c;
    }).collect(Collectors.joining());
}

Upvotes: 0

Laurentiu L.
Laurentiu L.

Reputation: 6686

Decide which special characters you want to escape and just call

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

You may keep all special characters you allow in some array then iterate it and replace the occurrences as exemplified. This method replaces all regex meta characters.

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;
}

You could use it as query=escapeMetaCharacters(query); Don't think that any library you would find would do anything more than that. At best it defines a complete list of specialCharacters.

Upvotes: 26

AMahajan
AMahajan

Reputation: 189

I had to do same thing in javascript. I came up with below solution. I think it might help someone.

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");

Upvotes: 2

Bathsheba
Bathsheba

Reputation: 234685

You need to use \\ to introduce a \ into a string literal; that is you need to escape the \. (A single backslash is used to introduce special characters into a string: e.g. \t is a tab.)

query = "hello\\+Search\\}query" is what you need.

Upvotes: 2

Related Questions