java

时间:2016-09-19 18:15:58

标签: java regex

我有两条线是相同的,但它们有两个不同的结果!

public static String data =
                "Rome:Jan 81.2,Feb 63.2,Mar 70.3,Apr 55.7,May 53.0,Jun 36.4,Jul 17.5,Aug 27.5,Sep 60.9,Oct 117.7,Nov 111.0,Dec 97.9" +
                "\n" +
                "London:Jan 48.0,Feb 38.9,Mar 39.9,Apr 42.2,May 47.3,Jun 52.1,Jul 59.5,Aug 57.2,Sep 55.4,Oct 62.0,Nov 59.0,Dec 52.9" +
                "\n";

public static void main(String[] args) {
    System.out.println(mean("London", data));
}

public static double mean(String town, String strng) {
    Matcher matched=checkExists(town + "(.*?)\n", data);
    if (matched!=null)
        return calAvr(matched.group(1)+",");
    return -1;
}

private static Matcher checkExists(String regex, String source) {
    Matcher matcher = Pattern.compile(regex).matcher(source);
    if (matcher.find()) return matcher;
    return null;
}

private static double calAvr(String splitData) {
    double res = 0.0;
    int count = 0;
    //Matcher matcher = Pattern.compile("\\s(.*?),").matcher(splitData);
    Matcher matcher=checkExists("\\s(.*?),", splitData);
    while (matcher.find()) {
        res += Double.parseDouble(matcher.group(1));
        count++;
    }
    return res / count;
}

这两行是一样的:

//Matcher matcher = Pattern.compile("\\s(.*?),").matcher(splitData);
Matcher matcher=checkExists("\\s(.*?),", splitData);

当我使用第一个时,它会找到所有数字。在第二个中,我只返回匹配器对象并使用它,但它找不到" 48.0"这是第一次出现!我在平均功能中使用了匹配器对象并且工作正常!

1 个答案:

答案 0 :(得分:3)

打电话的时候 Matcher matcher=checkExists("\\s(.*?),", splitData); 您是第一次执行find(),然后是 你使用while (matcher.find())意味着你失去了第一个匹配,因为你在第一个find之后执行find而没有处理数据。

但是,当您使用Matcher matcher = Pattern.compile("\\s(.*?),").matcher(splitData);而不是......

时,这不会发生

请参阅文档here

  

public boolean find()尝试查找的下一个子序列   与模式匹配的输入序列。这个方法从   这个匹配器区域的开头,或者,如果之前的调用   该方法是成功的,匹配器此后没有被重置, at   第一个字符与上一场比赛不匹配。

     

如果匹配成功,则可以通过获得更多信息   开始,结束和分组方法。