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);
    }

}

a) 为什么我需要调用m.appendTrail(s)第 4 行来获取未截断的字符串?

b)为什么当我取消注释并放置"mom"为新的正则表达式时输出没有变化?

4

3 回答 3

3

只需阅读文档

Matcher.appendReplacement

Matcher.appendTail

这一切都解释了一起使用这两种方法的意图是什么。


在创建匹配器实例之后更改模式当然不会影响已经创建的匹配器。您必须在创建匹配器之前更改模式。

于 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() 沿着匹配器字符串(“Our mom and Our dad”)迭代,如果找到模式(“Our”),它用替换字符串(“My”)替换模式(“Our”)并且将迭代的任何内容放入 StringBuffer (s)。如果没有找到更多的模式,它什么也不做。也就是说,它不会在最后一个模式之后附加任何内容。因此,调用 .appendTail() 来获取匹配器字符串的剩余部分。

m.replaceAll("我的"); 可以用来达到相同的结果。

于 2009-12-15T21:33:50.213 回答