理解模式和匹配器

时间:2009-12-15 20:44:41

标签: java regex matcher

考虑以下代码:

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)为什么我需要在第4行调用m.appendTrail(s)来获取未切割的字符串?

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

3 个答案:

答案 0 :(得分:3)

请阅读

的文档

Matcher.appendReplacement

Matcher.appendTail

所有这些都解释了将这两种方法结合使用的意图。


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

答案 1 :(得分:1)

回答b)

Pattern.compile()是一种静态方法。如果取消注释p.compile();,它将创建一个您丢弃的新对象(它没有分配给任何东西)。为了得到你想要的东西,你需要做类似的事情:

p = Pattern.compile("mom");

然后从新创建的模式中获取一个新的匹配器。

答案 2 :(得分:0)

回答a)

.appendReplacement()沿Matcher字符串(“我们的妈妈和我们的父亲”)进行迭代,如果找到模式(“我的”),它会替换替换字符串(“My”)作为模式(“我们的” “)并将迭代的任何内容放入StringBuffer中。如果找不到更多模式,它什么也不做。也就是说,它不会在最后一个模式之后附加任何内容。因此,调用.appendTail()来获取Matcher字符串的其余部分。

m.replaceAll( “我”);可以用来达到相同的效果。