2012-06-06 48 views
1

我需要更換有說,例如 「8:00 AM - 5:00 PM」 字符串中的字符串 「8:00 AM ET - 5:00 PM ET」更換使用的replaceAll或模式匹配器

我曾嘗試下面的代碼,但它不工作...

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 

請讓我知道爲什麼第一種方法沒有工作,如果有可能糾正第二種方法。

回答

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()

2

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