JAVA:替换字符串中的单词

JAVA:替换字符串中的单词,java,string,replace,words,Java,String,Replace,Words,我想替换字符串中的单词,但我遇到了一些困难。这是我想做的。我有字符串: String a = "I want to replace some words in this string"; 它应该像某种翻译一样工作。我正在使用String.replaceAll()执行此操作,但由于这个原因,它无法完全工作。假设我正在从英语翻译为德语,那么这应该是输出(Ich在德语中的意思是I) 现在字符串a的输出如下: "ich want to replace some words ich**n** **th*

我想替换字符串中的单词,但我遇到了一些困难。这是我想做的。我有字符串:

String a = "I want to replace some words in this string";
它应该像某种翻译一样工作。我正在使用
String.replaceAll()
执行此操作,但由于这个原因,它无法完全工作。假设我正在从英语翻译为德语,那么这应该是输出(
Ich
在德语中的意思是
I

现在字符串
a
的输出如下:

"ich want to replace some words ich**n** **th**ich**s** **str**ich**ng**"
如何只替换单词,而不是单词中的子单词?

使用
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);
        }

您可以使用正则表达式的单词绑定,即\b

String toTranslate = "\\bI\\b";
String translated = "Ich";
a = a.replaceAll(toTranslate.toLowerCase(), translated.toLowerCase());
这将确保我完全被它自己的话分开


编辑:我看错了问题,意识到你想要整句话。如上所述,由于我已经说明了

replaceAll
使用正则表达式,所以您可以添加或机制来检查要替换的单词周围是否没有非空格字符

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

如果你在“I”后面加一个空格,那么当提到“Ich”这个词时,应该用它来代替,但是如果你的词以“I”结尾,那么这是另一个问题,如果你假设
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");

这是一个可行的

是的,单词边界就是解决方案。我只是在正则表达式中这样做:

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

不要与第二个参数相混淆,它是字符串(来自哈希表)。

使用Regex的groups
()
。难道你不能假设
I
总是用英语大写,然后在你的代码中删除
。toLowerCase()
,它应该可以工作
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");
text.replaceAll("\\b" + parts1[i] + "\\b", map.element.value);