@Test
public void method2(){
Pattern pt1=Pattern.compile("\\d{2}[a-z]{2,3}");
Pattern pt2=Pattern.compile("\\d{2}?[a-z]{2,3}?");
Pattern pt3=Pattern.compile("1{2,3}+");
String str="1111sada1--";
Matcher mc1=pt1.matcher(str);
Matcher mc2=pt2.matcher(str);
Matcher mc3=pt3.matcher(str);
System.out.println(mc1.find()+" "+mc1.group());
System.out.println(mc2.find()+" "+mc2.group());
System.out.println(mc3.find()+" "+mc3.group());

System.out.println("\\\\");

}输出结果:
true 11sad
true 11sa
true 111
\\
第三行结果有点不懂
不应该是false的吗
possessive不是先读取全部,然后匹配一次,应该不会成功的啊

解决方案 »

  1.   

    api:
    X{n,m}+ X,至少 n 次,但是不超过 m 次 •Possessive 数量词,它可以尽可能多地进行匹配,即使这样做导致所有匹配都成功时也如此。 这样怎么会找不到3个1呢
      

  2.   

    Pattern pt2=Pattern.compile("\\d{2}?[a-z]{2,3}?");
    2个数字2个字母 11sa[a-z]{2,3}?  带?是勉强型 这个量词匹配满足模式所需的最少字符数    Pattern pt3=Pattern.compile("1{2,3}+");
    + 占有型  至少 n 次,但是不超过 m 次  出现大于3显示3次
      

  3.   

    在使用possessive的时候,如果Pattern pt3=Pattern.compile("1{2,3}+");possessive的"+"后面没有需要匹配的东西,那么作用跟greedy是没什么区别的。只有后面有的东西才有区别,比如:public static void main(String[] args) {
    Pattern pt1=Pattern.compile("\\w{2,5}s");
    Pattern pt2=Pattern.compile("\\w{2,5}+s");
    String str="1111sada1--";
    Matcher mc1=pt1.matcher(str);
    Matcher mc2=pt2.matcher(str);
    System.out.println(mc1.find() + ":::" + mc1.group());
    System.out.println(mc2.find());
    }先输出true然后是false
    因为possessive的时候\\w{2,5}+会匹配前面5个字符,类似于贪婪的,但是当第六个字符不是s的时候,发现错误,他并不会回溯,所以就会是false。
      

  4.   

    恩,这是JAVA常有的正则
    http://jiake.iteye.com/blog/182095