[英]Java String replaceAll Recursive behavior
昨天我正在制作定制的信件和备忘录。 我制作了映射关键字,如:[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].
我很困惑,谷歌搜索它并尝试使其正确,之后我用replace()
更改了replaceAll()
replace()
EX: str=str.replace(key,vals.get(key));
现在工作正常。 问题是为什么替换所有正在做这种行为的是replaceAll()
的核心概念以及何时使用replace()
何时使用replaceAll()
。 谢谢
在讨论您的问题之前,我希望您了解Java API具有的String#格式 。 有了它,你可以简单地写
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()
。
让我们看一下replace和replaceAll方法的javadoc。 转到javadocs
public String replace(CharSequence target, CharSequence replacement)
将与该文字目标序列匹配的此字符串的每个子字符串替换为指定的文字替换序列。 替换从字符串的开头到结尾,例如,在字符串“aaa”中将“aa”替换为“b”将导致“ba”而不是“ab”。
因此,简单来说,它用替换词替换所有目标词。
public String replaceAll(String regex, String replacement)
将给定替换的给定正则表达式匹配的此字符串的每个子字符串替换。
要理解给定的行为,了解正则表达式的工作原理非常重要。 正则表达式是一个独立的世界,但是,我们可以在这里讨论给定的正则表达式。
方括号将一组字符组合在一起。 调用时,该集合中的任何字符都匹配。
例如:[abc]将匹配所有a,b和c。 由于replaceAll使用正则表达式匹配,它将用替换字符串替换所有a,b和c。
replaceAll()
匹配使用正则表达式 。
使用纯文本replace()
匹配。
正则表达式[Employee]
是一个字符类 ,它匹配任何单个字符,即E
, m
, p
, l
, o
, y
或e
。
replaceAll将第一个参数视为正则表达式。 所以你需要逃避正则表达式特定的字符,在你的情况下[和]。 它们表示一组字符,因此replaceAll匹配该集合中的每个字符并替换为您提供的值。 试试这个以获得你想要的输出 -
vals.put("\\[Employee\\]","John");
vals.put("\\[Salary\\]","12000");
在这里,我们已经逃脱了特殊符号[和],因此它不再将其视为一组。
ReplaceAll编译正则表达式并应用于字符串。 在这种情况下,由于你的密钥有'[',它会匹配其中的任何字符。 因此,对于每次出现,它都已替换为该值
replaceAll()需要一个正则表达式,但replace()需要精确的字符串(char序列)。 正则表达式需要转义特殊字符。 因此,当需要简单地替换字符串时使用replace()方法,并且当需要匹配正则表达式并需要替换它时,请使用replaceAll()。
此链接可能对您有所帮助。 基本上,唯一的区别是replaceAll
替换所有匹配regex
作为参数提供的字符串,而replace()
替换基于chars
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.