Warum ersetzt das Beispiel zweimal, sodass "##" zurückgegeben wird? Ich hätte erwartet, dass egal welcher Teststring verwendet wird, immer "#" zurückgegeben wird.
[autoit]MsgBox(0, "", StringRegExpReplace("a", ".*", "#"))
[/autoit]Warum ersetzt das Beispiel zweimal, sodass "##" zurückgegeben wird? Ich hätte erwartet, dass egal welcher Teststring verwendet wird, immer "#" zurückgegeben wird.
[autoit]MsgBox(0, "", StringRegExpReplace("a", ".*", "#"))
[/autoit]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:
#include <Array.au3>
$a_Array = StringRegExp("a", ".*", 3)
_ArrayDisplay($a_Array)
$a_Array = StringRegExp("a", ".*?", 3)
_ArrayDisplay($a_Array)
$a_Array = StringRegExp("a", ".+", 3)
_ArrayDisplay($a_Array)
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: "^.*$".
Danke für die erläuternden Beispiele. An Stringanfang und -ende hatte ich nicht gedacht.