2016-09-19 111 views
1

我有两条线是相同的,但他们有两个不同的结果!在REGEX 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); 

当我使用的第一个它找到所有numbers.In第二个我只返回匹配对象,并使用它,但它不能找到第一个出现的“48.0”!我在平均func中使用了匹配器对象,并且工作正常!

+0

你能发布一个执行两条线(相同)的java文件并比较不同的输出吗? –

+0

你正在得到每一个数字在第一行,因为我试图运行代码'81.2'不会与你的正则表达式 –

回答

3

当你调用 Matcher matcher=checkExists("\\s(.*?),", splitData); 您是第一次执行find(),然后 使用while (matcher.find())这意味着比你,因为你是第一个find后执行find无需处理数据只是已经失去了第一场比赛。

这不会发生,但是,当你使用Matcher matcher = Pattern.compile("\\s(.*?),").matcher(splitData);,而不是...

看到文档here

公共布尔find()会试图找到匹配的 输入序列的下一个子该模式。该方法从该匹配器区域的起始 开始,或者如果之前调用方法成功并且匹配器尚未被重置,则在 第一个字符与先前匹配不匹配。

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