2016-10-29 4 views
1

Wie der Titel sagt, habe ich einen Java-Code geschrieben, um alle Übereinstimmungen in einer bestimmten Datei mit regulären Ausdrücken zu zählen, wenn ich den Code ausführe, ist der Unterschied von die Übereinstimmungen in der Datei. Es funktioniert perfekt, wenn ich jeden String in einer neuen Zeile getrennt habe. Hier ist mein Code:Java Regex zählen nicht alle Übereinstimmungen in einer Datei

Dies ist die Methode, die zählen sollten:

private static int countOccurrences(String path, String regex) { 
    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher; 
    int count = 0; 
    try { 
     BufferedReader br = new BufferedReader(new FileReader(path)); 
     String line; 
     while ((line = br.readLine()) != null) { 
      matcher = pattern.matcher(line); 
      if (matcher.find()) 
       count++; 
     } 
     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return count; 
} 

Hier ist der Code mit dieser Methode:

String regex = "(00966|\\+966)\\d{9}"; 
int countNumbers = countOccurrences(fileContainsNumbers, regex); 

Hier ist die Datei, die ich aus lesen:

Lorem Ipsum ist einfach dummy +966111111111 Text der Druck-und Schriftsatz Industrie. + 966222222222 Lorem Ipsum hat Standard Dummy-Text jemals +966333333333 seit dem 1500, als ein unbekannter Drucker nahm eine Galeere des Typs und verschlüsselt +966444444444 +96645789541063 es zu einem Typ Muster Buch zu machen. +966569874514 Es hat nicht nur fünf Jahrhunderte überlebt, sondern auch den Sprung in den elektronischen Satz , der +966569874514 im Wesentlichen unverändert blieb. Es war popularisiert +966569874514 in den 1960er Jahren mit der Veröffentlichung von Letraset Blätter mit Lorem Ipsum Passagen und in jüngerer Zeit mit Desktop Publishing-Software wie Aldus PageMaker +966555555555 einschließlich Versionen von Lorem Ipsum.

Antwort

1

Sie verwenden die find() Methode in der falschen Weise. Statt

if (matcher.find()) 
    count++; 

sollten Sie tun

while (matcher.find()) 
    count++; 

Sie sehen, können Sie mehrere Matches pro Zeile haben. So kann diese Methode für jede Zeile, die diese mehrere Übereinstimmungen enthält, mehrmals true zurückgeben. Aber hör auf zu zählen nach dem ersten wahren!

Mit anderen Worten: Wenn Sie alle Übereinstimmungen in jeder Zeile zählen möchten, dann hören Sie nicht auf, nach der ersten Übereinstimmung in einer Zeile zu zählen!

+0

Oh ich sehe, deshalb hört es auf, beim ersten Match pro Zeile zu zählen. aber durchläuft dieser Code die gesamte Datei? oder muss ich eine andere Schleife in der Schleife der Datei verwenden? – Chance

+1

Warum versuchst du es nicht einfach? Ich denke, es sollte funktionieren. Sie sehen - Sie haben bereits alle Zeilen in dieser Datei durchlaufen. Und dann sollten Sie den Matcher loopen, um die Übereinstimmungen PER-Zeile zu zählen. Ersetzen Sie IF mit WHILE, wie bereits vorgeschlagen, fügt diese innere Schleife, die Sie benötigen, hinzu! – GhostCat

+0

Es hat perfekt funktioniert, Vielen Dank .. Ich werde versuchen, eine bessere Möglichkeit zu finden, "eine Schleife" anstelle von "verschachtelten Schleifen" zu verwenden, wenn möglich. Markiert als Antwort;) – Chance

Verwandte Themen