ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
2022
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Hardi82 ist offline Mitglied Silber
    Registriert seit
    Mar 2005
    Beiträge
    59
    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. #2
    Avatar von MAN
    MAN
    MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    431
    Hallo Hardi82,

    ein Ansatz wäre Folgender:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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 :
    1
    2
    
    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 :
    1
    2
    
    > Spalten A bis IV      =>    [A-Z]{1,2}
    > Zeilen 1 bis 65536    =>    \\d{1,5}


    Viele Grüße,
    MAN
     
    BLT - Die Bundesliga Tabelle der Saison 2013 / 2014 - http://www.spacehoster.de/blt/ NEU: mit Tippspiel!
    EMail: mstangel@gmx.de

  3. #3
    Hardi82 ist offline Mitglied Silber
    Registriert seit
    Mar 2005
    Beiträge
    59
    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. #4
    Hardi82 ist offline Mitglied Silber
    Registriert seit
    Mar 2005
    Beiträge
    59
    So, ich nochmal. Hab den Vorschlag implementiert und funktioniert alles super. Vielen Dank.

    Gruß
    Hardie
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 26.08.09, 13:35
  2. mehrere mySQL-Abfragen in einem String
    Von Dac-XP im Forum PHP
    Antworten: 4
    Letzter Beitrag: 05.11.07, 18:53
  3. Antworten: 2
    Letzter Beitrag: 04.09.06, 12:07
  4. Antworten: 3
    Letzter Beitrag: 12.06.06, 00:59
  5. Antworten: 2
    Letzter Beitrag: 19.04.06, 22:13