考虑以下代码:
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"
作为新的正则表达式表达式时,为什么输出没有改变?
答案 0 :(得分:3)
请阅读
的文档所有这些都解释了将这两种方法结合使用的意图。
创建匹配器实例后更改模式当然不会影响已创建的匹配器。您必须在创建匹配器之前更改模式。
答案 1 :(得分:1)
回答b)
Pattern.compile()
是一种静态方法。如果取消注释p.compile();
,它将创建一个您丢弃的新对象(它没有分配给任何东西)。为了得到你想要的东西,你需要做类似的事情:
p = Pattern.compile("mom");
然后从新创建的模式中获取一个新的匹配器。
答案 2 :(得分:0)
回答a)
.appendReplacement()沿Matcher字符串(“我们的妈妈和我们的父亲”)进行迭代,如果找到模式(“我的”),它会替换替换字符串(“My”)作为模式(“我们的” “)并将迭代的任何内容放入StringBuffer中。如果找不到更多模式,它什么也不做。也就是说,它不会在最后一个模式之后附加任何内容。因此,调用.appendTail()来获取Matcher字符串的其余部分。
m.replaceAll( “我”);可以用来达到相同的效果。