2009-12-15 67 views
0

考虑以下代码:了解Pattern和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); 
    } 

} 

一)为什么我需要调用m.appendTrail(s)第4行,以获得unchopped字符串?

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

回答

3

刚刚看过的文档

Matcher.appendReplacement

Matcher.appendTail

这一切都说明有什么使用这两种方法的共同意向。


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

1

回答至b)

Pattern.compile()是一个静态方法。如果您取消注释p.compile();,它将创建一个您丢弃的新对象(它未分配给任何内容)。为了让您的本意,你需要做的是这样的:

p = Pattern.compile("mom");

,然后得到新创建模式的新的匹配。

0

回答一个)

.appendReplacement()沿匹配器遍历字符串(“我们的妈妈和我们的爸爸”),如果模式(“我们”)被发现,它替换替换字符串(”我的“)为模式(”我们“),并把它迭代到StringBuffer(s)。如果没有更多的模式被发现,它什么也不做。也就是说,它不会在最后一个模式之后追加任何东西。因此,调用.appendTail()来获取Matcher String的其余部分。

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