0

次のコードを検討してください。

import java.util.regex.*;

public class Pattern3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        Pattern p = Pattern.compile("Our"); //line 1
        Matcher m = p.matcher("Our mom and Our dad"); //line 2

        //p.compile(mom); commented line

         StringBuffer s = new StringBuffer();



       boolean found = m.find();

        while (found){
            m.appendReplacement(s, "My"); //line 3
            found=m.find();
        }

       m.appendTail(s); //line 4
       System.out.println(s);
    }

}

m.appendTrail(s)a)切り捨てられていない文字列を取得するために 4 行目を呼び出す必要があるのはなぜですか?

"mom"b) コメントを外して新しい正規表現として配置しても、出力が変わらないのはなぜですか?

4

3 に答える 3

3

のドキュメントを読むだけです

Matcher.appendReplacementおよび

Matcher.appendTail

これら 2 つの方法を一緒に使用する意図については、すべて説明されています。


もちろん、マッチャーのインスタンスを作成した後にパターンを変更しても、すでに作成されているマッチャーには影響しません。マッチャーを作成する前に、パターンを変更する必要があります。

于 2009-12-15T20:51:37.287 に答える
1

b) への回答

Pattern.compile()静的メソッドです。のコメントを外すp.compile();と、破棄する新しいオブジェクトが作成されます (何にも割り当てられません)。意図したものを得るには、次のようにする必要があります。

p = Pattern.compile("mom");

次に、新しく作成されたパターンから新しいマッチャーを取得します。

于 2009-12-15T20:59:13.823 に答える
0

a) への回答

.appendReplacement() は、Matcher String ("Our mom and Our dad") に沿って反復し、パターン ("Our") が見つかった場合、パターン ("Our") を置換文字列 ("My") に置き換え、繰り返し処理したものをすべて StringBuffer に入れます。それ以上パターンが見つからない場合は、何もしません。つまり、最後のパターンの後に何も追加しません。したがって、.appendTail() が呼び出されて、Matcher String の残りを取得します。

m.replaceAll("My"); を使用して同じ結果を得ることができます。

于 2009-12-15T21:33:50.213 に答える