2014-09-09 4 views
5

Ho un input di dizionario. Il dizionario viene iterato per sostituire lo key dal dizionario nel testo. Ma la funzione replaceAll sostituisce anche lo subString.Come assicurarsi che replaceAll sostituirà un'intera parola e non una sottostringa

come assicurare che corrisponderà la parola intera (nel suo complesso e non come una subString)

String text= "Synthesis of 1-(2,6-dimethylbenzyl)-1H-indole-6-carboxylic acid [69-3] The titled compound (883 mg) sdvfshd[69-3]3456 as a white solid was prepared" 

dictionary= {[69-3]=1-(2,6-dimethylbenzyl)-1H-indole-6-carboxylic acid } 

for(Map.Entry<String, String> entry : dictionary.entrySet()){ 

     text=text.replaceAll("\\b"+Pattern.quote(entry.getKey())+"\\b", entry.getValue()); 

} 
+1

Hai provato a controllare gli elementi per 'uguale' prima di sostituirlo? – Smutje

+1

Non ho capito la domanda ... cosa intendi per uguale ??? Sto usando tutto il testo per rimpiazzarlo e non lo ho intonato. – user2832203

risposta

7

replaceAll prende come parametro un'espressione regolare.

Nelle espressioni regolari, è disponibile word boundaries: \b (utilizzare \\b in una stringa letterale). Sono il modo migliore per garantire la corrispondenza una parola e non una parte di una parola: "\\bword\\b"

Ma nel tuo caso, non è possibile utilizzare i confini di parola, come non si è alla ricerca di una parola ([69-3] non è una parola).

suggerisco questo:

text=text.replaceAll("(?=\\W+|^)"+Pattern.quote("[69-3]")+"(?=\\W+|$)", ... 

L'idea è quella di abbinare un fine stringa o qualcosa che non è una parola. Non posso garantire che questa sia la soluzione giusta per te: un tale modello deve essere ottimizzato conoscendo l'esatto caso d'uso completo.

Si noti che se tutte le chiavi seguono uno schema simile potrebbe esserci una soluzione migliore rispetto a scorrere un dizionario, si potrebbe ad esempio utilizzare un modello come "(?=\\W+|^)\\[\\d+\\-\\d+\\](?=\\W+|$)".

+0

Sto usando Pattern.quote per mantenere intatti i caratteri speciali. ma anche questo non funziona. inoltre ho provato \\ b .. non funziona – user2832203

+1

@ user2832203 Si prega di scrivere nella domanda il codice che non funziona. –

+0

Ho aggiornato la domanda – user2832203