In my java code, if a string input has got any of the special characters mentioned, that should get preceded by \\
Special character set is {+, -, &&, ||, !, (, ), {, },[, ], ^, "", ~, *, ?, :, \}. I tried using String.replaceAll(old,new) but to my surprise its not working, even though I am giving proper values for 'old' and 'new'.
if old=":",new="\:"
I put the special chars in a String array, iterated it in a for loop, checked whether it is present in the string, if yes, input.replaceAll(":","\\:"). But its not giving me the intended output. Please help
String[] arr = { "+", "-", "&&", "||", "!", "(", ")", "{", "}",
"[", "]", "^", "\"", "~", "*", "?", ":", "\\", "AND", "OR" };
for (int i = 0; i < arr.length; i++) {
//'search' is my input string
if (search.contains((String) arr[i])) {
String oldString = (String) arr[i];
String newString = new String("\\" + arr[i]);
search = search.replaceAll(oldString, newString);
String newSearch = new String(search.replaceAll(arr[i],
newString));
}
}
Java Special Characters The solution to avoid this problem, is to use the backslash escape character.
Escape CharactersUse the backslash character to escape a single character or symbol. Only the character immediately following the backslash is escaped. Note: If you use braces to escape an individual character within a word, the character is escaped, but the word is broken into three tokens.
Java String replaceAll() The Java String class replaceAll() method returns a string replacing all the sequence of characters matching regex and replacement string.
Once you realise replaceAll takes a regex, it's just a matter of coding your chars as a regex.
Try this:
String newSearch = search.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\-])", "\\\\");
That whacky regex is a "look ahead" - a non capturing assertion that the following char match something - in this case a character class.
Notice how you don't need to escape chars in a character class, except a ] (even the minus don't need escaping if first or last).
The \\\\ is how you code a regex literal \ (escape once for java, once for regex)
Here's a test of this working:
public static void main(String[] args) {
String search = "code:xy";
String newSearch = search.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\-])", "\\\\");
System.out.println(newSearch);
}
Output:
code\:xy
String#replaceAll takes a regex as first parameter. So, your code will fail if the input in the string is a meta-character like - +.
You should use String#replace.
And also you don't need the last assignment: -
String newSearch = new String(search.replaceAll(arr[i], newString));
As, you are not using it at all. You are in fact assigning the modified string back to search, so it's not required.
Also, rather than using new String(...), to build your new string.
In fact, you just need a single line in your if-statement.
Ok now, after that explanation, you can now use the below for-loop: -
for (int i = 0; i < arr.length; i++) {
if (search.contains(arr[i])) {
search = search.replace(arr[i], "\\" + arr[i]);
}
}
Try to use the below one. Please use replace method instead of ReplaceAll
search = search.replace(oldString, newString);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With