2015-07-21 155 views
-1

我想替換字符串中的單詞,但我遇到了一些困難。這是我想要做的。我有字符串:JAVA:替換字符串中的單詞

String a = "I want to replace some words in this string"; 

它應該像某種翻譯工作。我正在用String.replaceAll()這樣做,但由於這個原因,它並不能完全正常工作。假設我正在翻譯從英文到德文,比這應該是輸出(Ich意味着I德文)。

String toTranslate = "I"; 
String translated = "Ich"; 
a = a.replaceAll(toTranslate.toLowerCase(), translated.toLowerCase()); 

現在字符串a的輸出將是這樣的:

"ich want to replace some words ich**n** **th**ich**s** **str**ich**ng**" 

如何只更換的話,不中的話子詞?

+0

使用Regex的組'()'。 –

+0

難道你不能假設'我'將永遠captialized英文,然後在你的代碼只是刪除'.toLowerCase()',它應該工作 – depperm

回答

1

使用split(" ")獲取句子中的每個單詞。然後在每個單詞上使用replaceAll。

String a = "I want to replace some words in this string"; 
     String toTranslate = "I"; 
     String translated = "Ich"; 
     String newString[]=a.split(" "); 
     for (String string : newString) { 
      string=string.replaceAll(toTranslate, toTranslate.toLowerCase());//Adding this line ensures you dont miss any uppercase toTranslate 
      string=string.replaceAll(toTranslate.toLowerCase(), translated.toLowerCase()); 
      System.out.println("after translation ="+string); 
     } 
-1

您可以使用正則表達式的話語束縛,這是\ b

String toTranslate = "\\bI\\b"; 
String translated = "Ich"; 
a = a.replaceAll(toTranslate.toLowerCase(), translated.toLowerCase()); 

這應該保證我完全分離到它自己的字

編輯:我誤解的問題,並實現你想要整個單詞。見上面,因爲我已經說明了

2

replaceAll使用正則表達式,因此您可以添加word boundarieslook-around機制來檢查您要替換的單詞是否沒有非空格字符。

String toTranslate = "I"; 
String translated = "Ich"; 
a = a.replaceAll("(?<!\\S)"+toTranslate.toLowerCase()+"(?!\\S)", translated.toLowerCase()); 

您還可以添加引號機制來逃脫任何正則表達式元字符像你想更換+*(內字。順便說一句,你不需要改變你的字符串爲小寫,只需添加不區分大小寫的標誌爲正則表達式(?i)

a = a.replaceAll("(?i)(?<!\\S)"+Pattern.quote(toTranslate)+"(?!\\S)", translated.toLowerCase()); 
0
String toTranslate = "I "; 
String translated = "Ich "; 
a = a.replaceAll(toTranslate.toLowerCase(), translated.toLowerCase()); 

如果經過「我」應該說到這個詞「腦出血」,但取代它添加一個空格,如果你的字是「我」,那麼這就是一個問題

0
結束

如果您認爲I將始終用英文大寫,因爲它應該然後

a = a.replaceAll(toTranslate, translated); 

會的工作,否則就需要更換這兩種情況下

a = a.replaceAll(toTranslate, translated); 
a = a.replaceAll("([^a-zA-Z])("+toTranslate.toLowerCase()+")([^a-zA-Z])", "$1"+translated.toLowerCase()+"$3"); 

這裏是一個工作example

0

是,詞的邊界解決方案。我只是在正則表達式這樣做:

text.replaceAll("\\b" + parts1[i] + "\\b", map.element.value); 

不要被它的字符串中的第二個參數(從哈希表)混淆。