【问题标题】:JAVA: Replacing words in stringJAVA:替换字符串中的单词
【发布时间】:2015-07-21 16:50:54
【问题描述】:

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

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**"

如何只替换单词而不是单词中的子词?

【问题讨论】:

  • 使用正则表达式的组()
  • 你不能假设I 总是用英文大写,然后在你的代码中删除.toLowerCase() 它应该可以工作

标签: java string replace words


【解决方案1】:

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());

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      String toTranslate = "I ";
      String translated = "Ich ";
      a = a.replaceAll(toTranslate.toLowerCase(), translated.toLowerCase());
      

      如果你在“I”之后添加一个空格,当涉及到“Ich”这个词时,它应该替换它,但是如果你的词以“I”结尾,那就是另一个问题

      【讨论】:

        【解决方案4】:

        如果您认为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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            可以使用RegEx的分词,即\b

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

            这应该确保 I 完全分离成它自己的单词

            编辑:我误读了这个问题,并意识到你想要整个单词。见上文,因为我已经说明了这一点

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-07-03
              • 2015-03-03
              • 1970-01-01
              • 2014-04-01
              • 1970-01-01
              相关资源
              最近更新 更多