日期:2014-05-20  浏览次数:20790 次

请解释一下这个正则匹配代码的运行结果为何不是我期望的
Java code
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
  public static void main(String[] args) {
    String str = "第一个:1111<br/>第一个:2222<br/>第二个:3333<br/>";
    Pattern p = Pattern.compile("第一个:(.*?)<br/>第二个:(.*?)<br/>");
    Matcher m = p.matcher(str);
    if (m.find()) {
      System.out.println(m.group(1));
      System.out.println(m.group(2));
    }
  }
}


我希望拿到2222和3333
结果却不是

请解释一下,并给出能用的表达式

------解决方案--------------------

------解决方案--------------------
你的
Pattern p = Pattern.compile("第一个:(.*?)<br/>第二个:(.*?)<br/>");
从1111就开始匹配了,所以输出
1111<br/>第一个:2222

------解决方案--------------------
支持“福临天下”
------解决方案--------------------
探讨
支持“福临天下”

------解决方案--------------------
顶下 关注
------解决方案--------------------
Java code

String str = "第一个:1111<br/>第一个:2222<br/>第二个:3333<br/>";
        Pattern p = Pattern.compile("第一个:1111<br/>第一个:(.*?)<br/>第二个:(.*?)<br/>");
        Matcher m = p.matcher(str);
        if (m.find()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }

------解决方案--------------------
Pattern p = Pattern.compile("第一个:(\\d*?)<br/>第二个:(\\d*?)<br/>");

把.改成\\d 肯定行
------解决方案--------------------
.的范围太大了 是字符就匹配 打印出来的肯定是一大串字符 而不是楼主要的数字


------解决方案--------------------
Pattern p = Pattern.compile("第一个:([0-9]*?)<br/>第二个:[0-9]*?<br/>");
------解决方案--------------------
如果只是要数字,可以用\\d匹配数字

------解决方案--------------------
同意jeojeo的说法
------解决方案--------------------
探讨
同意jeojeo的说法

------解决方案--------------------
引用楼主 tteesstt 的帖子:
Pattern p = Pattern.compile("第一个:(.*?)<br/>第二个:(.*?)<br/>");