了解Pattern和Matcher
问题描述:
考虑以下代码:了解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"
作为新的正则表达式时,为什么输出不会改变?
答
刚刚看过的文档
这一切都说明有什么使用这两种方法的共同意向。
创建匹配器实例后更改模式当然不会影响已创建的匹配器。您必须在创建匹配器之前更改模式。
答
回答至b)
Pattern.compile()
是一个静态方法。如果您取消注释p.compile();
,它将创建一个您丢弃的新对象(它未分配给任何内容)。为了让您的本意,你需要做的是这样的:
p = Pattern.compile("mom");
,然后得到新创建模式的新的匹配。
答
回答一个)
.appendReplacement()沿匹配器遍历字符串(“我们的妈妈和我们的爸爸”),如果模式(“我们”)被发现,它替换替换字符串(”我的“)为模式(”我们“),并把它迭代到StringBuffer(s)。如果没有更多的模式被发现,它什么也不做。也就是说,它不会在最后一个模式之后追加任何东西。因此,调用.appendTail()来获取Matcher String的其余部分。
m.replaceAll(“My”);可以用来达到相同的结果。