我需要替换一个字符串,例如“上午8:00 - 下午5:00”和“美国东部时间上午8:00 - 东部时间下午5:00”
我尝试了以下代码,但它不起作用......
time.replaceAll("AM", "AM ET");
time.replaceAll("PM", "PM ET");
convertedTime = time;
System.out.println(convertedTime); // didnt get replaced
我尝试了以下方式并且正常工作,但未正确更换,
Pattern p = Pattern.compile("(AM)");
Matcher m = p.matcher(time);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, "AM ET");
}
m.appendTail(sb);
p = Pattern.compile("(PM)");
m = p.matcher(time);
while(m.find()) {
m.appendReplacement(sb, "PM ET");
}
m.appendTail(sb);
System.out.println("sb: " + sb); // coming as sb: 8:00 AM ET - 5:00 PM8:00 AM - 5:00 PM ET
请让我知道为什么第一种方法不起作用,以及是否有可能在第二种方法中纠正。
答案 0 :(得分:7)
当您调用replaceAll()
方法时,它会返回一个带有修改后值的新String
- 它不会更改原始String
。
因此,您的代码应该是......
String convertedTime = time.replaceAll("AM", "AM ET");
convertedTime = convertedTime.replaceAll("PM", "PM ET");
System.out.println(convertedTime);
甚至是......
String convertedTime = time.replaceAll("AM", "AM ET").replaceAll("PM", "PM ET");
System.out.println(convertedTime);
由于上述代码的简单性,我不会建议您使用基于模式的代码 - 它过于复杂而无法实现相同的结果。但是,看到你问过,你可能只需要将m = p.matcher(time);
行更改为m = p.matcher(sb.toString());
,然后清除StringBuffer
,这样就可以提供第一次修改的结果进入第二个p.matcher()
方法,并删除输出中的duplicate
。像这样......
Pattern p = Pattern.compile("(AM)");
Matcher m = p.matcher(time);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, "AM ET");
}
m.appendTail(sb);
p = Pattern.compile("(PM)");
m = p.matcher(sb.toString()); // CHANGED
sb = new StringBuffer(); // ADDED
while(m.find()) {
m.appendReplacement(sb, "PM ET");
}
m.appendTail(sb);
System.out.println("sb: " + sb);
但是,正如我所说,只使用replaceAll()
会更好更简单。
答案 1 :(得分:2)
尝试从方法中重新分配返回的字符串。例如time = time.replaceAll("AM", "AM ET");