1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Regexp: mehrere matches in einem String?

Dieses Thema im Forum "Java Grundlagen" wurde erstellt von Hardi82, 17. November 2008.

  1. Hardi82

    Hardi82 Grünschnabel

    Hallo Leute. Heute habe ich folgendes Problem:

    SUM(A1:A3) + SUM(A4:A10) + SUM(A3:A5) = zu untersuchende String

    SUM\(\$?[A-z]+\$?[0-9]+:\$?([A-z]+)\$?([0-9]+)\) ?\+ ?SUM\(\$?([A-z]+)\$?([0-9]+):\$?[A-z]+\$?[0-9]+\) = das Pattern

    Wie ihr sicherlich erkennen könnt, möchte ich ein Muster "SUM(xy:xy) + SUM(xy:xy)" herausfiltern. Für die ersten beiden SUMs funktioniert das auch super, allerdings findet der Matcher die zweite Kombination nicht. Also:

    SUM(A1:A3) + SUM(A4:A10) wird gefunden und ausgegeben
    SUM(A4:A10) + SUM(A3:A5) wird nicht gefunden

    Warum ist das so? Ich dachte, dass wenn der matcher eine Übereinstimmung findet, dann wieder bei dem darauffolgenden Buchstaben beginnt und er somit die zweite kombination finden müsste. Oder muss ich da noch extra was angeben? Wenn ich übrigends folgenden String überprüfen lasse, findet er zwei (anstelle von eugentlich drei) Übereinstimmungen:

    SUM(A1:A3) + SUM(A4:A10) + SUM(A3:A5) + SUM(A12:A15)

    Und dann gleich noch die Frage hinterher: kann man den Patternausdruck auch noch vereinfachen/-kürzen?

    Danke vorab für eure Unterstützung und Tipps.

    Grüße
    Hardie
  2. MAN

    MAN Erfahrenes Mitglied

    Hallo Hardi82,

    ein Ansatz wäre Folgender:

    Code (Java):
    1. String text = "SUM(A1:A3) + SUM(A4:A10) + SUM(A3:A5)";
    2. String regexpPart = "SUM\\(\\$?[A-Z]{1,2}\\$?\\d{1,5}:\\$?[A-Z]{1,2}\\$?\\d{1,5}\\)";
    3. String regexp = "(" + regexpPart + " ?\\+ ?" + regexpPart + ")";
    4.  
    5. Matcher matcher = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE).matcher(text);
    6.  
    7. int pos = 0;
    8.  
    9. while(matcher.find(pos)) {
    10.     String match = matcher.group();
    11.  
    12.     System.out.println(match);
    13.  
    14.     pos = matcher.start() + 1;
    15. }
    Hier werden die Groups einfach manuell durchgegangen und die find-Position auf den letzten Start-Index der Group plus 1 gesetzt. Somit werden alle Übereinstimmungen gefunden.

    Ergebnis:

    Code (Text):
    1. SUM(A1:A3) + SUM(A4:A10)
    2. SUM(A4:A10) + SUM(A3:A5)

    Habe zudem die Regular Expression noch ein wenig angepasst, da ich hier von der Anwendung Excel ausgehe ;)
    Code (Text):
    1. > Spalten A bis IV      =>    [A-Z]{1,2}
    2. > Zeilen 1 bis 65536    =>    \\d{1,5}

    Viele Grüße,
    MAN
  3. Hardi82

    Hardi82 Grünschnabel

    Hallo MAN,

    deine Lösung sieht vielversprechend aus und auch etwas übersichtlicher :). Ich werde es nachher mal in meine Anwendung integrieren. Vielen Dank schonmal.

    Grüße
    Hardie
  4. Hardi82

    Hardi82 Grünschnabel

    So, ich nochmal. Hab den Vorschlag implementiert und funktioniert alles super. Vielen Dank.

    Gruß
    Hardie

Diese Seite empfehlen