1

たとえば、「8:00 AM - 5:00 PM」という文字列を「8:00 AM ET - 5:00 PM ET」に置き換える必要があります。

次のコードを試しましたが、うまくいきません...

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

最初のアプローチが機能しなかった理由と、2 番目のアプローチで修正できるかどうかを教えてください。

4

2 に答える 2

7

メソッドを呼び出すと、変更された値replaceAll()で new が返されます。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);

上記のコードは単純であるため、パターンベースのコードを使用することはお勧めしません。同じ結果を得るには複雑すぎます。ただし、あなたが尋ねたかのように、最初の変更の結果を 2 番目のメソッドにフィードし、出力でを削除するために、m = p.matcher(time);行をに変更しm = p.matcher(sb.toString());、 をクリアするだけでよいでしょう。このようなもの...StringBufferp.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 に答える