2012-08-11 8 views

risposta

36

Usa "\\$\\$" nel secondo parametro:

String s=" $$"; 
s=s.replaceAll("\\s+\\$\\$","\\$\\$"); 
//or 
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$"); 

Il $ è il simbolo del gruppo nel parametro di sostituzione di espressione regolare

Quindi è necessario sfuggire

+0

Puoi anche spiegarmi perché java sta trattando il secondo parametro come regex anziché come stringa normale? – FranXho

+1

Non lo tratta come un'espressione regolare. Dalla documentazione di Matcher.appendReplacement, "La stringa di sostituzione può contenere riferimenti a sottosequenze acquisite durante la corrispondenza precedente: Ogni occorrenza di $ {nome} o $ g sarà sostituita dal risultato della valutazione del gruppo corrispondente (nome) o gruppo (g) rispettivamente ... Un simbolo di dollaro ($) può essere incluso come letterale nella stringa di sostituzione precedendolo con una barra rovesciata (\ $). " – user393274

5

Il problema qui non è l'espressione regolare, ma la sostituzione:

$ è utilizzato per fare riferimento ai gruppi corrispondenti (). Quindi è necessario per sfuggire esso pure con un backslash (e una seconda barra rovesciata per rendere il compilatore Java felice):

String s=" $$"; 
s = s.replaceAll("\\s+\\$\\$", "\\$\\$"); 
0

$ ha un significato speciale nella stringa di sostituzione, così come nella regex, quindi bisogna sfuggire anche lì:

s=s.replaceAll("\\s+\\$\\$", "\\$\\$"); 
0
String s="$$"; 
     s=s.replaceAll("\\s+\\$\\$","$$"); 
56

Da String#replaceAll javadoc:

si noti che le barre rovesciate (\) e il simbolo del dollaro ($) nella stringa sostitutiva potrebbe causare risultati diversi rispetto a se fosse trattato come una stringa di sostituzione letterale; vedi Matcher.replaceAll. Utilizzare Matcher.quoteReplacement (java.lang.String) per sopprimere il significato speciale di di questi caratteri, se lo si desidera.

Così fuga di una stringa di sostituzione arbitraria può essere fatto come il seguente:

String s = " $$"; 
s = s.replaceAll("\\s+\\$\\$", Matcher.quoteReplacement("$$")); 

sfuggire anche del modello può essere fatto con Pattern#quote

String s = " $$"; 
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$")); 
+6

+1. Molto meglio di fuggire da soli –

+1

Questa soluzione è migliore della risposta accettata in termini di contenuto dinamico. –

+0

Sincethe la stringa di sostituzione è sconosciuta nel 99.99_9%, questa risposta ha molto più senso. – AxelH

0

Ho avuto lo stesso problema, quindi finisco per implementare la sostituzione di tutto con split.
ha risolto l'eccezione per me

public static String replaceAll(String source, String key, String value){ 
    String[] split = source.split(Pattern.quote(key)); 
    StringBuilder builder = new StringBuilder(); 
    builder.append(split[0]); 
    for (int i = 1; i < split.length; i++) { 
     builder.append(value); 
     builder.append(split[i]); 
    } 
    while (source.endsWith(key)) { 
     builder.append(value); 
     source = source.substring(0, source.length() - key.length()); 
    } 
    return builder.toString(); 
} 
0

Questa è la strada giusta. Sostituisci il valore letterario $ con escape $ str.replaceAll("\\$", "\\\\\\$")

Problemi correlati