Pattern p = Pattern.compile("(?!=e).{3,5}?");
Matcher m = p.matcher("love52000");
while(m.find()){
System.out.println(m.group());
}
为什么会输出lov e52 000 而不是lov 520 00printContent("i love you".matches("^i\\b\\w*\\b.*you$"));输出true
printContent("i love you".matches("^i\\b\\w*\\b\\w*you$"));输出false
这两个表达式的结果为什么不一样

解决方案 »

  1.   

    先回答第1个问题:"(?!=e).{3,5}?"(?!表示 否定的look ahead
    (?=表示 肯定的look ahead(?!=e,对java来讲,只能理解为找一个位置,这个位置的后面不是"=e",
    这样,从第一个位置就是匹配的,所以.{3,5}就在每三个字符的地方生效了。我估计你的意思是想表达:(?!e).{3,5}?
    但即便按照这个想法,也会输出:lov 520,而没有后面的00。第二个问题暂时不懂,研究一下。
      

  2.   

    研究了一下,回答第二个问题:\\b代表word boundary,所以它映射的也是一个位置,而不消耗具体的字符。
    所以,如果我们将"^i\\b\\w*\\b.*you$"
    改造成:"^i(\\b)(\\w*)(\\b)(.*)you$"
    我们会发现:
    前三个Group什么都没有匹配,而.*匹配了" love "
    有此可以推断,到第二个\\b的时候,其实什么都没有匹配,
    所以:
    printContent("i love you".matches("^i\\b\\w*\\b\\w*you$"));
    到第二个\\w时,实际上才匹配到i后面,这样,其中包含空白字符,自然不能满足\\w*的要求。