String content = "<td>1</td><td>2</td>abcd z";
String regex = "<td>(\\d{1,3})</td>.+?z";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(content);
while (m.find()) {
System.out.println(m.group(1));
}结果打印为1,而我已经在regex里的"."的"+"后面加上了"?",应该是Reluctant形式的。为什么还会取到1,而不是2.

解决方案 »

  1.   

    从前面第一个开始匹配尝试,第一个1满足你的要求的。如果你需要用第二个,那个点改一下,比如String regex = "<td>(\\d{1,3})</td>[^<>]+?z";也就是不允许再出现<>了
      

  2.   


    String content = "<td>1</td><td>2</td>abcd z";
    String regex = "<td>(\\d{1,3})</td>[a-z ]+?z";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(content);
    while (m.find()) {
    System.out.println(m.group(1));
    }嗯,谢谢你的解答,我上面这一个regex也能使打印2.但是我不明白的是为什么当".+"的时候,后面加?就不会是最小匹配了呢?
      

  3.   

    因为
    1 点(.)可以匹配任何字符,包括<>,
    2 匹配是从第一个字符开始的,你看看那个1 也是满足你的要求的哦,因为后面的那个<td>2</td>被点给匹配掉了。你的a-z也可以,不过局限性比较大,如果有数字呢?有其它符号呢?所以到底用什么界限符号,你得自己考虑清楚,我觉得< > 比较合适。
    普通的用 \\w 就行了