2009-02-12 11 views
25

Sto pulendo un testo in arrivo nel mio codice Java. Il testo include molti "\ n", ma non come in una nuova riga, ma letteralmente "\ n". Stavo usando replaceAll() dalla classe String, ma non sono stato in grado di eliminare "\ n". Questo non sembra funzionare:Pulizia e sostituzione del testo: cancella n da un testo in Java

String string; 
string = string.replaceAll("\\n", ""); 

Né fa questo:

String string; 
string = string.replaceAll("\n", ""); 

Credo che questo ultimo è identificato come un nuova linea attuale, in modo da tutte le nuove linee di testo sarebbero rimosso.

Inoltre, quale sarebbe un modo efficace per rimuovere diversi schemi di testo errato da una stringa. Sto usando espressioni regolari per rilevarle, cose come caratteri HTML riservati, ecc. E replaceAll, ma ogni volta che uso replaceAll, viene letta l'intera stringa, giusto?

AGGIORNAMENTO: Grazie per le vostre grandi risposte. 'Ho esteso questa domanda qui:
Text replacement efficiency
che sto chiedendo in particolare di efficienza: D

+0

stavi cercando di rimuovere letteralmente ogni istanza di "\ n", o sei cercando di rimuovere i nuovi caratteri di controllo della linea? Penso che cambierà la regex – mmcrae

risposta

43

Hooknc ha ragione. Vorrei solo pubblicare una piccola spiegazione:

"\\ n" si traduce in "\ n" dopo che il compilatore è terminato (dato che si esce dalla barra inversa). Quindi il motore regex vede "\ n" e pensa a una nuova riga, e rimuoverà quelli (e non il letterale "\ n" che hai).

"\ n" si traduce in una nuova riga reale dal compilatore. Quindi il carattere della nuova riga viene inviato al motore regex.

"\\\\" è brutto, ma giusto. Il compilatore rimuove le sequenze di escape, quindi il motore regex vede "\\ n". Il motore regex vede i due backslash e sa che il primo lo sfugge in modo che si traduca nel controllo dei caratteri letterali '\' e 'n', dando il risultato desiderato.

Java è bello (è la lingua in cui lavoro) ma dover pensare fondamentalmente alla doppia escape delle espressioni regolari può essere una vera sfida.Per divertimento in più, sembra che StackOverflow voglia provare a tradurre anche i backslash.

+2

Buona spiegazione. Vorrei anche aggiungere che molte persone dimenticano che il primo argomento in String.replaceAll() è un'espressione regolare, non una stringa letterale. –

+0

C'è una differenza tra l'invio "\ n" o il carattere della nuova linea al motore regex? Entrambi sembrano avere gli stessi risultati. – ADTC

22

Penso che avete bisogno di aggiungere un altro paio di slashies ...

String string; 
string = string.replaceAll("\\\\n", ""); 

Spiegazione: La il numero di slashies ha a che fare con il fatto che "\ n" di per sé è un personaggio controllato in Java.

Quindi per ottenere i caratteri reali di "\ n" da qualche parte è necessario utilizzare "\ n". Che se stampato con darci: "\"

Stai cercando di sostituire tutti "\ n" nel tuo file. Ma non stai cercando di sostituire il controllo "\ n". Quindi hai provato "\ n" che sarà convertito nei caratteri "\ n". Fantastico, ma forse non così tanto. La mia ipotesi è che il metodo replaceAll creerà effettivamente un'espressione regolare usando ora i caratteri "\ n" che saranno erroneamente interpretati come il carattere di controllo "\ n".

Whew, quasi fatto.

Utilizzare replaceAll ("\\ n", "") per prima cosa converte "\\ n" -> "\ n" che verrà utilizzato dall'espressione regolare. Il "\ n" verrà quindi utilizzato nell'espressione regolare e in realtà rappresenta il testo di "\ n". Quale è quello che stai cercando di sostituire.

+0

Grazie per la risposta. Esiste una spiegazione per così tanti slashies? –

+0

Modificato per aggiungere una spiegazione. – hooknc

+0

Sono confuso ... Non riuscivo a farlo funzionare finché non ho usato 3 '\' in 'replaceAll()' per 'String before =" this \ nhere ";' – mmcrae

11

Invece di String.replaceAll(), che utilizza le espressioni regolari, è preferibile utilizzare String.replace(), che sostituisce semplicemente le stringhe (se si utilizza almeno Java 1.5).

String replacement = string.replace("\\n", ""); 

dovrebbe fare quello che vuoi.

+0

Probabilmente anche più veloce. –

+0

Buona idea. Basta evitare l'intera regex che analizza e fugge dal momento che non lo stai usando. – MBCook

+0

Grande, grazie.Lo sto usando per \ n, ma sostituisco All per altri pattern come tag HTML e caratteri riservati. Se hai qualche consiglio su più efficienza invece di ripetere replaceAll per ogni pattern, sarebbe molto apprezzato. –

1

Le altre risposte sono state trattate in modo sufficiente su come eseguire questa operazione con replaceAll e come è necessario evitare le barre inverse se necessario.

Dal 1.5., C'è anche String.replace(CharSequence, CharSequence) che esegue la sostituzione della stringa letterale. Ciò può semplificare notevolmente molti problemi di sostituzione delle stringhe, poiché non è necessario sfuggire a metacaratteri di espressioni regolari come ., *, | e sì, \ stesso.

Quindi, data una stringa che può contenere la sottostringa "\n" (non '\n'), siamo in grado di eliminarle come segue:

String before = "Hi!\\n How are you?\\n I'm \n good!"; 
System.out.println(before); 
// Hi!\n How are you?\n I'm 
// good! 

String after = before.replace("\\n", ""); 

System.out.println(after); 
// Hi! How are you? I'm 
// good! 

Nota che se ti ostini a usare replaceAll, è possibile impedire la bruttezza utilizzando Pattern.quote:

System.out.println(
    before.replaceAll(Pattern.quote("\\n"), "") 
); 
// Hi! How are you? I'm 
// good! 

si dovrebbe anche usare Pattern.quote quando si è dato una stringa arbitraria che deve essere abbinata alla lettera anziché come un modello di espressione regolare.

2

Prova questo. Spero che sia d'aiuto.

raw = raw.replaceAll("\t", ""); 
raw = raw.replaceAll("\n", ""); 
raw = raw.replaceAll("\r", ""); 
0

Normalmente \ n funziona correttamente. Altrimenti puoi scegliere più dichiarazioni replaceAll. prima applica una replaceAll sul testo, quindi riapplica nuovamente sul testo. Dovrebbe fare quello che stai cercando.

-2

Credo che replaceAll() sia un'operazione costosa. La soluzione qui di seguito sarà probabilmente un rendimento migliore:

String temp = "Hi \n Wssup??";   
System.out.println(temp); 

StringBuilder result = new StringBuilder(); 

StringTokenizer t = new StringTokenizer(temp, "\n"); 

while (t.hasMoreTokens()) { 
    result.append(t.nextToken().trim()).append(""); 
} 
String result_of_temp = result.toString(); 

System.out.println(result_of_temp); 
+0

Questo flat-out non fa ciò che l'OP voleva. – Pops

1

Ho usato questa soluzione per risolvere il problema:

String replacement = str.replaceAll("[\n\r]", ""); 
3
string = string.replaceAll(""+(char)10, " "); 
Problemi correlati