java语言 用String的replace方法替换变量值的问题,替换无效

public class String0210
{
public static void main(String[] args)
{
String debugSql = "dfgsdfgsdfgsdfgsdfgsdfgsdfgs > ${aa_test_1419} AND dfgsdfgsdfgsdfgs < ${aa_test_1410})))";
Map<String, Object> finalParametersMap = new HashMap<String, Object>();
finalParametersMap.put("diao_test_1419", "1419");
finalParametersMap.put("diao_test_1410", "1410");
int startAt = 0;
int endAt = 0;
for (int i = 0; i < finalParametersMap.size(); i++)
{
startAt = debugSql.indexOf("${");
endAt = debugSql.indexOf("}");
String param = debugSql.substring(startAt + 2, endAt);
String value = (String) finalParametersMap.get(param);
StringBuilder sb = new StringBuilder();
sb.append("${").append(param).append("}");
debugSql.replace(sb.toString(), value);
}
System.out.println(debugSql);
}
}
期望的结果是
dfgsdfgsdfgsdfgsdfgsdfgsdfgs > 1419 AND dfgsdfgsdfgsdfgs < 1410
实际的结果是
dfgsdfgsdfgsdfgsdfgsdfgsdfgs > ${aa_test_1419} AND dfgsdfgsdfgsdfgs < ${aa_test_1410})
diao_test_1419 换成 aa_test_1410 笔误,输入错了。



public class YuGiOh
{
public static void main ( String[] args )
{
String debugSql = "dfgsdfgsdfgsdfgsdfgsdfgsdfgs > ${aa_test_1419} AND dfgsdfgsdfgsdfgs < ${aa_test_1410})))";
debugSql = debugSql.replaceAll ("\\$\\{([^\\_]+\\_){2}([^\\{\\}\\_]+)\\}", "$2");
System.out.println (debugSql);
}
}

追问

大神绝了,佩服!
hashMap里面的value如果在key里面取不到怎么办
也就是必须从hashMap里面才能获得value
这样怎么办

追答

那你就

package test;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class YuGiOh
{
public static void main ( String[] args )
{
String debugSql = "dfgsdfgsdfgsdfgsdfgsdfgsdfgs > ${aa_test_1419} AND dfgsdfgsdfgsdfgs < ${aa_test_1410})))";
String regex = "\\$\\{(([^\\_]+\\_){2}([^\\{\\}\\_]+))\\}";
Map<String, Object> finalParametersMap = new HashMap<String, Object> ();
finalParametersMap.put ("aa_test_1419", "1419");
finalParametersMap.put ("aa_test_1410", "1410");
Pattern pattern = Pattern.compile (regex);
Matcher matcher = pattern.matcher (debugSql);
while (matcher.find ())
{
String key = matcher.group (1);
debugSql = debugSql.replaceAll ("\\$\\{" + key + "\\}", finalParametersMap.get (key).toString ());
}
System.out.println (debugSql);
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-27
把循环最后一句的 debugSql.replace(sb.toString(), value); 换成 debugSql = debugSql.replace(sb.toString(), value); 就可以了,replace只是替换但是原有字符串不会变,你需要重新赋值一下本回答被提问者采纳
第2个回答  2015-02-10
String类型好像不能替换把,换成StringBuffer
相似回答