使用replaceAll或Pattern Matcher替换字符串

Gop*_*opi 1 java string replace

我需要更换一个字符串,例如"上午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
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方式和它的工作,但没有得到正确的替换,

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
Run Code Online (Sandbox Code Playgroud)

请让我知道为什么第一种方法不起作用,如果有可能在第二种方法中纠正.

wat*_*ios 7

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

因此,您的代码应该是......

String convertedTime = time.replaceAll("AM", "AM ET");
convertedTime = convertedTime.replaceAll("PM", "PM ET");
System.out.println(convertedTime);
Run Code Online (Sandbox Code Playgroud)

甚至这......

String convertedTime = time.replaceAll("AM", "AM ET").replaceAll("PM", "PM ET");
System.out.println(convertedTime);
Run Code Online (Sandbox Code Playgroud)

由于上述代码的简单性,我不建议您使用基于模式的代码 - 它过于复杂而无法实现相同的结果.但是,看起来好像你问过,你可能只需要改变你的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);
Run Code Online (Sandbox Code Playgroud)

但是,正如我所说,只是使用它会更好,更简单replaceAll().