2014-09-09 6 views
5

Ich habe einen Eingang des Wörterbuchs. Das Wörterbuch wird iteriert, um das key aus dem Wörterbuch im Text zu ersetzen. Aber replaceAll Funktion ersetzt die subString auch.Wie sicherzustellen, dass replaceAll ein ganzes Wort und nicht eine Unterzeichenfolge ersetzen wird

Wie um sicherzustellen, dass es das ganze Wort (als Ganzes und nicht als subString) übereinstimmen

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

Haben Sie versucht, die Elemente vor dem Ersetzen auf "gleich" zu prüfen? – Smutje

+1

Ich habe die Frage nicht bekommen .. was meinst du mit gleich ??? Ich benutze den gesamten Text zu ersetzen und habe es nicht in Tokens. – user2832203

Antwort

7

replaceAll als Parameter einen regulären Ausdruck kommt.

In regulären Ausdrücken haben Sie word boundaries: \b (verwenden Sie \\b in einem Zeichenfolgenliteral). Sie sind der beste Weg, Sie passendes Wort, um sicherzustellen, und keinen Teil eines Wortes: "\\bword\\b"

Aber in Ihrem Fall, können Sie nicht Wortgrenzen verwenden, da Sie nicht nach einem Wort suchen ([69-3] ist kein Wort).

Ich schlage vor, diese:

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

Die Idee ist, ein String Ende oder etwas passen, das kein Wort ist. Ich kann nicht garantieren, dass dies die richtige Lösung für Sie sein wird: Ein solches Muster muss abgestimmt werden, wenn Sie genau den vollständigen Anwendungsfall kennen.

Beachten Sie, dass, wenn alle Ihre Schlüssel einem ähnlichen Muster folgen, es möglicherweise eine bessere Lösung gibt, als ein Wörterbuch zu durchlaufen, Sie könnten beispielsweise ein Muster wie "(?=\\W+|^)\\[\\d+\\-\\d+\\](?=\\W+|$)" verwenden.

+0

Ich benutze Pattern.quote, um die Sonderzeichen intakt zu halten. aber selbst das funktioniert nicht. auch ich habe versucht \\ b .. es funktioniert nicht – user2832203

+1

@ user2832203 Bitte schreiben Sie in Ihrer Frage den Code, der nicht funktioniert. –

+0

Ich aktualisierte die Frage – user2832203

Verwandte Themen