文字列内の特殊文字をエスケープし、エスケープされた文字列からエスケープ文字を削除するために、次のロジックを試しました。
public static void main(String a[])
{
String keyword = "otterbox 3500 series { { waterproof case \\(clear) phones";
System.out.println("INut keyword is "+keyword);
StringBuilder sb = new StringBuilder();
// * and ? is not included as they are wild card
for (int i = 0; i < keyword.length(); i++){
char c = keyword.charAt(i);
if (c == '\\' || c == '!' || c == '(' || c == ')' || c == '&' ||
c == ':' || c == '^' || c == '[' || c == ']' ||
c == '-' || c == '{' || c == '}' ||
c == '~'){
sb.append('\\');
}
sb.append(c);
}
keyword=sb.toString();
System.out.println("Escaped keyword is "+keyword);
if(keyword.contains("\\")){
int l=0;
int l2=0;
for (int i = 0; i < keyword.length(); i++){
char c = keyword.charAt(i);
if(c=='\\')l++;
if (c == '!' || c == '(' || c == ')' || c == '&' ||
c == ':' || c == '^' || c == '[' || c == ']' || c=='-'||
c == '{' || c == '}' || c == '~' || c=='(' || c== ')'){
keyword = keyword.replaceAll("\\\\\\"+c, ""+c);
l2++;
}
}
if(l==1) keyword= keyword.replaceAll("\\\\", "");
if(l>1 && l2==1) keyword = keyword.replaceFirst("\\\\", "");
}
System.out.println("Final "+keyword);
}
文字列に\を使用したかったので、最後のキーワードはotterbox 3500シリーズ{{防水ケース\(クリア)電話)になると思います。ただし、出力は「Final otterbox 3500 series {{waterproof case \ \(clear)phones」として表示されます。私はここで何が欠けていますか?