1

我需要用“8:00 AM ET - 5:00 PM ET”替换一个字符串,例如“8:00 AM - 5:00 PM”

我已经尝试了以下代码,但它不起作用......

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

请让我知道为什么第一种方法不起作用,以及是否可以在第二种方法中更正。

4

2 回答 2

7

当您调用该replaceAll()方法时,它会返回一个String带有修改后值的 new - 它不会更改原始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().

于 2012-06-06T14:11:14.703 回答
2

尝试重新分配方法中返回的字符串。例如time = time.replaceAll("AM", "AM ET");

于 2012-06-06T14:11:21.530 回答