2014-03-31 25 views
1

我需要更改字符串如下: 在任何創建的特殊字符之前在此處添加「\」示例: 如果字符串= $ {Name},結果應該是===> \ $ {NAME}在特定字符前插入一個字符

我寫了這個:

private static String getFormattedString(String variable) { 
    char [] specialCharacters = {'.', '\\', '+', '*', '?', '[', '^', ']', '$', '(', ')' ,'{' ,'}', '=', '!', '<', '>', '|', ':', '-'}; 
    String old = variable; 
    String formatted = ""; 
    int i=0; 
    while(i<old.length()) { 
    for (int j=0;j<specialCharacters.length;j++) { 

if (old.charAt(i) == specialCharacters[j]) { 
    formatted+=old.substring(0, i)+"\\"+old.substring(i, i+1); 
    old=variable.substring(i+1,variable.length()); 
    break; 
} 
    } 
    i++; 
} 
return formatted; 
} 

,但我得到一個錯誤的結果:

Formatted String : ++++> \${NAME\} 

我真的很困惑,任何想法會不勝感激。

+4

如果你只是想逃避'$',你爲什麼有'特殊字符列表中的{'和'}'? –

+1

...另外,由於'{'和'}'在特殊字符列表中,您的實現有一個錯誤。它不會逃避第一個'{'。 – Seelenvirtuose

+0

@Seelenvirtuose「它不會逃脫第一個{」是的,這是我的問題謝謝你。 – AmiraGL

回答

4

試試這個:

private static final List<Character> SPECIAL = Arrays.asList('.', /* etc */); 

public static String escape(final String input) 
{ 
    final StringBuilder sb = new StringBuilder(input.length()); 
    final CharBuffer buf = CharBuffer.wrap(input); 
    char c; 

    while (buf.hasRemaining()) { 
     c = buf.get(); 
     if (SPECIAL.contains(c)) 
      sb.append('\\'); 
     sb.append(c); 
    } 

    return sb.toString(); 
} 

CharBuffer未充分利用,即使是最好的方法以迭代一個String的字符!)


如果您使用番石榴15+,您也可以編寫自己的CharEscaper;像所有番石榴一樣,它的功能非常好!

+0

謝謝你,我也會檢查番石榴:)) – AmiraGL

+1

@AmiraGL是的,_do_檢查番石榴...你最終會發現你不能沒有它:p – fge

1

如果你只是想逃避任何特殊字符,請嘗試使用StringEscapeUtils從Apache的百科全書:

import org.apache.commons.lang.StringEscapeUtils; 
(...) 
    String result = StringEscapeUtils.escapeJava(variable); 
0

嘗試用String.replaceAll()

String strgg = "${Name}"; 
System.out.println(strgg.replaceAll("\\$", "\\\\\\$")); 

輸出:

\${Name} 
-2

嘗試使用的replaceAll功能

private static String getFormattedString(String variable) { 
    //No need this. 
    // char [] specialCharacters = {'.', '\\', '+', '*', '?', '[', '^', ']', '$', '(', ')' ,'{' ,'}', '=', '!', '<', '>', '|', ':', '-'}; 
    variable = variable.replaceAll(".","\\."); //same for all. 
    variable = variable.replaceAll("+","\\+");. 
    variable = variable.replaceAll("*","\\*"); 
return formatted; 
} 
+0

確保你首先逃離'\\'然後。 –

+0

我相信這是AmiraGL所要求的。 –

+0

不起作用。 1.字符串是不可變的; 2.「.replaceAll()」的第一個參數是一個正則表達式。 – fge

相關問題