StringRegExpReplace ersetzt bei .* als pattern zweimal

  • Du hast als Quantifizierer "*" gewählt das entspricht {0,} - also etwas mit der Länger 0 oder länger.
    Ich denke man versteht es am besten wenn man sich mal anschaut was StringRegExp eigentlich matcht:

    [autoit]

    #include <Array.au3>
    $a_Array = StringRegExp("a", ".*", 3)
    _ArrayDisplay($a_Array)

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

    $a_Array = StringRegExp("a", ".*?", 3)
    _ArrayDisplay($a_Array)

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

    $a_Array = StringRegExp("a", ".+", 3)
    _ArrayDisplay($a_Array)

    [/autoit]

    gehen wir mal die Beispiele durch.
    Im ersten haben wir * als Quantifizierer. Also 0 oder mehr aber möglichst so lang wie möglich (gierig).
    StringRegExp fängt also am Anfang an und nimmt jedes Zeichen und davon so viel wie möglich - das ist erreicht sobald es "a" gefunden hat.
    Nun sucht es weiter ob noch mehr im String dieses Pattern matcht. Und siehe da: Hinter "a" kommt nichts mehr (das StringEnde welches man ja auch matchen kann) - und "nichts" ist ja auch ein mögliches Ergebnis - also kommt das auch noch mit in die Ergebnisliste.

    Nun zum zweiten Beispiel:
    Wir haben *? als Quantifizierer. Also 0 oder mehr Zeichen aber so kurz wie möglich (nicht gierig).
    StringRegEx fängt am Anfang des Strings an: Vor dem "a" steht nichts (der matchbare Stringanfang) - super das passt - rein in die Ergebnisliste.
    Dann kommt das "a" - passt auch - rein damit.
    Hinter dem a kommt dann wieder nichts (das Stringende) - und wir haben nun drei Matches in diesem String.

    Den Unterschied sieht man dann ganz gut wenn man mal statt * ein + verwendet - also 1 oder mehr Zeichen.
    Um zu verhindern, dass Stringanfang und Stringende als eigenständige Ergebnisse gematcht werden könnte man z.B. folgendes Pattern nehmen: "^.*$".