2009-12-15 71 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」);可以用來達到相同的結果。