第一个方法是我一开始的想法,这个想法明显使用笨办法,而且只适用于固定的情况,这里发出来看一看就行
package RegularExpression; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import java.util.regex.Matcher; public class demo2 { public static void main(String[] args) { StringBuffer sb = new StringBuffer(); StringBuffer sb1 = new StringBuffer(); Map<String,String> map = new HashMap<>(); map.put("name","zhang"); map.put("lang","math"); String s = "Hello, ${name}! You are learning ${lang}!"; for(String key:map.keySet()){ if(key.equals("name")){ Pattern p1 = Pattern.compile("\\{name\\}"); Matcher m1 = p1.matcher(s); while(m1.find()){ m1.appendReplacement(sb,map.get(key)); } m1.appendTail(sb); } if(key.equals("lang")){ Pattern p2 = Pattern.compile("\\{lang\\}"); Matcher m2 = p2.matcher(sb.toString()); while(m2.find()){ m2.appendReplacement(sb1,map.get(key)); } m2.appendTail(sb1); } } System.out.println(sb1.toString()); } }
然后是第二种方法,是在第一种方法的基础上改进的
package RegularExpression; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import java.util.regex.Matcher; public class demo2 { public static void main(String[] args) { Map<String,String> map = new HashMap<>(); map.put("name","zhang"); map.put("lang","math"); String s = "Hello, ${name}! You are learning ${lang}!"; for(String key:map.keySet()){ Pattern p = Pattern.compile("\\{"+key+"\\}"); Matcher m = p.matcher(s); StringBuffer sb = new StringBuffer(); while(m.find()){ m.appendReplacement(sb,map.get(key)); } m.appendTail(sb); s = sb.toString(); } System.out.println(s); } }
这里的思路也是将字符串中的{name}和{lang}分别提出来,在不同的循环中各替换一次
方法二的思路是直接用key作为区分了,不像方法一里面写两个if语句
然后还有一点,替换{lang}的时候,不应该还用最开始的字符串s,这样的话一开始的{name}就等于没替换。所以要用{name}替换后的字符串,放入
Matcher m = p.matcher(s);
这里的做法是将替换{name}后的字符串作为变量s指向的新字符串
Sign in to make a reply
雨鸢梦
第一个方法是我一开始的想法,这个想法明显使用笨办法,而且只适用于固定的情况,这里发出来看一看就行
然后是第二种方法,是在第一种方法的基础上改进的
这里的思路也是将字符串中的{name}和{lang}分别提出来,在不同的循环中各替换一次
方法二的思路是直接用key作为区分了,不像方法一里面写两个if语句
然后还有一点,替换{lang}的时候,不应该还用最开始的字符串s,这样的话一开始的{name}就等于没替换。所以要用{name}替换后的字符串,放入
这里的做法是将替换{name}后的字符串作为变量s指向的新字符串