Regexp: mehrere matches in einem String?

Hardi82

Mitglied
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
 
Hallo Hardi82,

ein Ansatz wäre Folgender:

Java:
String text = "SUM(A1:A3) + SUM(A4:A10) + SUM(A3:A5)";
String regexpPart = "SUM\\(\\$?[A-Z]{1,2}\\$?\\d{1,5}:\\$?[A-Z]{1,2}\\$?\\d{1,5}\\)";
String regexp = "(" + regexpPart + " ?\\+ ?" + regexpPart + ")";

Matcher matcher = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE).matcher(text);

int pos = 0;

while(matcher.find(pos)) {
    String match = matcher.group();

    System.out.println(match);

    pos = matcher.start() + 1;
}

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:
SUM(A1:A3) + SUM(A4:A10)
SUM(A4:A10) + SUM(A3:A5)


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


Viele Grüße,
MAN
 
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
 
Zurück