2014-09-09 10 views
5

Mam dane wejściowe ze słownika. Słownik jest iterowany, aby zastąpić key ze słownika w tekście. Ale funkcja replaceAll również zastępuje subString.Jak zapewnić replaceAll zastąpi całe słowo, a nie podString

Jak upewnić się, że będzie on pasował całe słowo (jako całość, a nie jako 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

Czy próbowałeś sprawdzić elementy "równe" przed wymianą? – Smutje

+1

Nie dostałem pytania .. co masz na myśli przez równe ??? Używam całego tekstu, aby go zastąpić i nie zmyliłem go. – user2832203

Odpowiedz

7

replaceAll przyjmuje jako parametr wyrażenie regularne.

W wyrażeniach regularnych masz word boundaries: \b (użyj \\b w ciągu literałowym). Są najlepszym sposobem, aby upewnić się, że pasujesz do słowa, a nie części słowa: "\\bword\\b"

Ale w twoim przypadku nie możesz używać granic słów, ponieważ nie szukasz słowa ([69-3] nie jest słowem).

proponuję to:

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

Chodzi o to, aby dopasować koniec sznurka lub coś, co nie jest to słowo. Nie mogę jednak zagwarantować, że będzie to odpowiednie rozwiązanie dla Ciebie: taki wzór musi być dostrojony, znając dokładny kompletny przypadek użycia.

Należy pamiętać, że jeśli wszystkie klucze mają podobny wzorzec, może istnieć lepsze rozwiązanie niż w przypadku iteracji słownika, można na przykład użyć wzorca, takiego jak "(?=\\W+|^)\\[\\d+\\-\\d+\\](?=\\W+|$)".

+0

Używam Pattern.quote, aby zachować nienaruszone znaki specjalne. ale nawet to nie działa. również próbowałem \\ b .. nie działa – user2832203

+1

@ user2832203 Proszę napisać w swoim pytaniu kod, który nie działa. –

+0

Zaktualizowałem pytanie – user2832203

Powiązane problemy