我想替换字符串中的单词,但我遇到的困难很小。这就是我想要做的。我有字符串:
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 :(得分:2)
replaceAll
使用正则表达式,因此您可以添加word boundaries或look-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());
答案 1 :(得分: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);
}
答案 2 :(得分:0)
String toTranslate = "I ";
String translated = "Ich ";
a = a.replaceAll(toTranslate.toLowerCase(), translated.toLowerCase());
如果你在“I”之后添加一个空格,它应该在单词“Ich”中替换它,但是如果你的单词以“I”结尾那么那就是另一个问题
答案 3 :(得分: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
答案 4 :(得分:0)
是的,单词边界是解决方案。我只是在正则表达式中做到了这一点:
text.replaceAll("\\b" + parts1[i] + "\\b", map.element.value);
不要与第二个参数混淆它的字符串(来自Hash表)。
答案 5 :(得分:-1)
您可以使用RegEx的单词绑定,即\ b
String toTranslate = "\\bI\\b";
String translated = "Ich";
a = a.replaceAll(toTranslate.toLowerCase(), translated.toLowerCase());
这应该确保我完全分成了自己的单词
编辑:我误解了这个问题并意识到你想要整个单词。见上文,因为我已经解释了