Java String replaceAll递归行为

时间:2018-01-31 05:28:30

标签: java replace replaceall

昨天我正在制作定制的信件和备忘录。我制作了映射关键字,如:[Dateofbirth],[Email],[Employee],[Salary]等,将在生成时替换。

  

示例:亲爱的[员工],您当前的薪水是[薪资]。

预期产出:

  

输出:亲爱的约翰,你目前的薪水是12000。

我正在使用replaceAll()方法,这是一个代码。

   String str = "dear [Employee], your Current Salary is [Salary].";
        Map<String,String> vals = new HashMap<String,String>();
        vals.put("[Employee]","John");
        vals.put("[Salary]","12000");
        for(String key:vals.keySet()){
            str=str.replaceAll(key,vals.get(key));
        }
        System.out.println(str);

但是出局是:

dJohn1200012000 [JohnJohnJohnJohnJohnJohnJohnJohn], JohnJohnu12000 Cu1200012000Johnnt 1200012000John1200012000John is [1200012000John1200012000John].

我很困惑并用Google搜索并尝试将其更正,之后我使用replaceAll()更改了replace()

EX: str=str.replace(key,vals.get(key));

现在工作正常。问题是为什么替换所有正在做这种行为的是replaceAll()的核心概念以及何时使用replace()何时使用replaceAll()。 感谢

7 个答案:

答案 0 :(得分:3)

在回答您的问题之前,我希望您了解Java API所具有的String#format。有了它,你可以简单地写

String formattedString = String.format("dear %s, your Current Salary is %.2f", "John", 12000.45);
System.out.println(formattedString);

如果您在不可避免的情况下自己这样做,replaceAll会将第一个参数视为正则表达式而不是要替换的普通字符串。

来自replaceAll的文档。

  

将此字符串中与给定正则表达式匹配的每个子字符串替换为给定的替换。

由于您的参数由[]组成,并且它们与其中的每个字符匹配。

如果您删除[]并使用不是#的元字符的任何其他特殊字符,它将起作用。

    String str = "dear #Employee#, your Current Salary is #Salary#.";
    Map<String, String> vals = new HashMap<String, String>();
    vals.put("#Employee#", "John");
    vals.put("#Salary#", "12000");
    for (String key : vals.keySet()) {
        str = str.replaceAll(key, vals.get(key));
    }
    System.out.println(str);

给你

dear John, your Current Salary is 12000.

或者只是按照你最后说的那样使用replace()

答案 1 :(得分:2)

让我们看一下replace和replaceAll方法的javadoc。转到javadocs

替换

public String replace(CharSequence target, CharSequence replacement)
  

替换此字符串中与文字目标匹配的每个子字符串   具有指定文字替换序列的序列。该   替换从字符串的开头到结尾,为   例如,替换&#34; aa&#34;用&#34; b&#34;在字符串&#34; aaa&#34;会导致   &#34; BA&#34;而不是&#34; ab&#34;。

因此,简单来说,它用替换词替换所有目标词。

的replaceAll

public String replaceAll(String regex, String replacement)
  

替换此字符串中与给定常规匹配的每个子字符串   表达式与给定的替代。

要了解给定的行为,了解正则表达式的工作原理非常重要。正则表达式是一个独立的世界,但是,我们可以在这里讨论给定的正则表达式。

方括号将一组字符组合在一起。调用时,该集合中的任何字符都匹配。

例如:[abc]将匹配所有a,b和c。由于replaceAll使用正则表达式进行匹配,因此它将用替换字符串替换所有a,b和c。

答案 2 :(得分:1)

replaceAll()使用regular expression进行匹配 replace()使用纯文本进行匹配。

正则表达式[Employee]是一个character class,可以匹配任何单个字符Empl,{ {1}},oy

答案 3 :(得分:1)

replaceAll将第一个参数视为正则表达式。所以你需要逃避正则表达式特定的字符,在你的情况下[和]。它们表示一组字符,因此replaceAll匹配该集合中的每个字符并替换为您提供的值。试试这个来获得你想要的输出 -

vals.put("\\[Employee\\]","John");
vals.put("\\[Salary\\]","12000");

这里我们已经转义了特殊符号[和],因此它不再将其视为一组。

工作计划 - https://www.ideone.com/2hCbIM

答案 4 :(得分:0)

ReplaceAll编译正则表达式并应用于字符串。在这种情况下,由于你的密钥有'[',它会匹配其中的任何字符。因此,对于每次出现,它都替换为值

答案 5 :(得分:0)

replaceAll()需要正则表达式,但 replace()需要精确的字符串(字符序列)。正则表达式需要转义特殊字符。因此,当需要简单地替换字符串时使用replace()方法,并且当需要匹配正则表达式并需要替换它时,请使用replaceAll()。

答案 6 :(得分:0)

This link可能对您有所帮助。 基本上,唯一的区别是replaceAll会替换所有与regex匹配的字符串作为参数,并replace()替换chars