Regex in Match weitersuchen statt nach Match

  • Hab mal eine RegEx-Frage die mich grad ziemlich beschäftigt:

    Ich habe folgenden String:

    Code
    Bla
    "ABCDEFG"nnn
    "ABCDEFGH"nnnn
    "ABCDEFGHIJHKLMNO"nnn
    "ABCDEFGHIJHKLMNO"nnn
    "ABCDEFGHIJHKLMNO"nnn
    "ABCDEFG"nnn
    "ABBB"nnn
    "ABBB"nnnnn


    Diesen will ich per regulären Ausdruck so auswerten das ich alle Buchstabenketten mit einer Mindestlänge von 7 Buchstaben als Output erhalte welche im Gesamtstring mindestens 3x vorkommen.

    Hab mal als Beispiel das in Autoit dargestellt:

    Problem dabei:
    Er findet korrekt die erste Zeichenkette ABCDEFG.
    Die Zeichenkette ABCDEFGHIJHKLMNO auf die die Bedingungen ebenfalls zutreffen wird allerdings nicht gefunden.
    Der Grund ist anscheinend der das der erste Match Teil des Matches 2 ist und und der Capture-Bereich bis Zeile 7 des Strings geht.
    Erst Nach diesem Capture-Bereich wird weiter gesucht - denn:

    Wenn ich folgendes als String nehme:

    Code
    Bla
    "ABCDEFG"nnn
    "ABCDEFGH"nnnn
    "QBCDEFGHIJHKLMNOPQRSTUVW"nnn
    "QBCDEFGHIJHKLMNOPQRSTUVW"nnn
    "QBCDEFGHIJHKLMNOPQRSTUVW"nnn
    "ABCDEFG"nnn
    "ABBB"nnn
    "ABBB"nnnnn


    wird QBCDEFGHIJHKLMNOPQRSTUVW nicht zusätzlich gematcht - aber wenn ich stattdessen diesen String nehme:

    Code
    Bla
    "ABCDEFG"nnn
    "ABCDEFGH"nnnn
    "ABCDEFG"nnn
    "QBCDEFGHIJHKLMNOPQRSTUVW"nnn
    "QBCDEFGHIJHKLMNOPQRSTUVW"nnn
    "QBCDEFGHIJHKLMNOPQRSTUVW"nnn
    "ABBB"nnn
    "ABBB"nnnnn


    schon.
    Die Frage ist also:
    Wie kann ich den regulären Ausdruck anweisen auch innerhalb eines Match-Bereiches weiter zu suchen?

    Vielen Dank euch schonmal im Voraus.

  • [ gelöst ] Doppelte Zahlen

    [autoit]

    $String = "Bla" & @CRLF & _
    '"ABCDEFG"nnn' & @CRLF & _
    '"ABCDEFGH"nnnn' & @CRLF & _
    '"ABCDEFGHIJHKLMNO"nnn' & @CRLF & _
    '"ABCDEFGHIJHKLMNO"nnn' & @CRLF & _
    '"ABCDEFGHIJHKLMNO"nnn' & @CRLF & _
    '"ABCDEFG"nnn' & @CRLF & _
    '"ABBB"nnn' & @CRLF & _
    '"ABBB"nnnnn' & @CRLF

    [/autoit][autoit][/autoit][autoit]

    $RegEx = StringRegExp($String, '(?s)(\w{7,})(?=(?:.+\1){2})', 3)

    [/autoit][autoit][/autoit][autoit]

    for $i = 0 to UBound($RegEx) - 1
    msgbox(0,"", $RegEx[$i])
    Next

    [/autoit]


    Mit eindeutigen Begrenzern ließe sich die Trefferschärfe noch erhöhen. ;)

  • Ich bin zwar kein RegEx Experte, aber "(?s)(\w{7,})" sollte doch reichen, um die 5 Ergebnisse zu bekommen oder?

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Um diese Matches zu erhalten ja.
    Aber meine Aufgabe ging ja noch ein bisschen weiter:

    [...] das ich alle Buchstabenketten mit einer Mindestlänge von 7 Buchstaben als Output erhalte welche im Gesamtstring mindestens 3x vorkommen

    Hintergrund des Ganzen war damals dass ich ein Programm geschrieben hatte welche Inf-Dateien für Windows-Installationen erstellt.
    Diese waren oft gespickt mit vielen Reg-Tweaks. Die Registry-Pfade kamen dort mehrfach vor und so wollte ich das das Programm die längsten häufig vorkommenden Strings nimmt und diese automatisch mit Inf-String-Variablen ersetzt so dass das ganze dann übersichtlicher wird.
    Nun brauch ich das ganze zwar nicht mehr aber dennoch danke für die Anregung.

  • Stimmt, die 3x habe ich wohl ubersehen. :whistling:

    Und so: "(?s)(\w{7,}){3,}"

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Dann würden mindestens 7 Wortzeichen gefunden welcher nochmal 14 Wortzeichen folgen. ;)
    Du siehst ja - die Aufgabenstellung ist doch bisschen trickier (ich hab ein Wort erfunden :) als es erst aussieht.