2016-09-19 2 views
1

Ich habe zwei Zeilen, die als die gleichen sind, aber sie haben zwei verschiedene Ergebnisse!REGEX Fehler in Java

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; 
} 

Diese beide Linie sind als das gleiche:

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

Als ich die erste es die ganze zweite numbers.In finden verwende ich es nur das Matcher-Objekt zurück und verwenden, aber es kann nicht Finde "48.0", was das erste Mal vorkommt! Ich habe das Matcher-Objekt in der mittleren Funktion verwendet und das funktioniert gut!

+0

Wären Sie in der Lage, eine einzelne Java-Datei zu veröffentlichen, die beide Zeilen (die identisch sind) ausführt und die verschiedenen Ausgaben vergleicht? –

+0

Sie erhalten jede Nummer in der ersten Zeile, da ich versuche, den Code '81.2' auszuführen, kommt nicht mit Ihrer Regex –

Antwort

3

Wenn Sie Matcher matcher=checkExists("\\s(.*?),", splitData); rufen Sie find() zum ersten Mal ausgeführt werden, und dann Sie while (matcher.find()) verwenden, was bedeutet, als Sie nur das erste Spiel verloren haben, weil du find nach den ersten find ohne den Umgang mit Daten ausgeführt werden.

Dies geschieht nicht, aber wenn Sie Matcher matcher = Pattern.compile("\\s(.*?),").matcher(splitData); stattdessen ...

siehe Dokumentation here

public boolean find() versucht, die nächste Teilfolge der Eingangssequenz zu finden, die passen das Muster. Diese Methode beginnt am Anfang dieser Matcher-Region mit , oder wenn ein vorheriger Aufruf von die Methode erfolgreich war und die Matcher seither nicht zurückgesetzt wurde, um das erste Zeichen, das nicht von der vorherigen Übereinstimmung gefunden wurde.

Wenn die Übereinstimmung erfolgreich ist, können weitere Informationen über die Methoden start, end und group abgerufen werden.