Wie Robert auch schon gesagt hat, kann man das so oder so sehen:
Ja, ich denke inzwischen, dass man sich darüber Gedanken machen sollte, bevor man diese Funktion mit "^$" anwendet.
Irritierend ist in diesem Fall das Verhalten von regexec(). Wird ein einzelner Zeilenwechsel '\n' gefunden, so wird als 'start-offset' und 'end-offset' der gleiche Index verwendet, d.h. der Treffer hat die Länge 0. Wenn jetzt der End-Offset direkt als Ausgangspunkt für eine weitere Suche verwendet wird, hängt das Programm in einer Endlosschleife, es ist also eine Sonderbehandlung erforderlich.
Zusätzlich wird auch ein leerer String, also nur ein Zeiger auf das beendende Nullbyte, als Treffer gewertet, wobei hier ebenfalls Start- und End Offset gleich sind. Mit diesem (überaschendem) Verhalten von regexec() kann man beide Sichtweisen abbilden. Das hängt dann von der Definition der Endebedingungen und von der Bewertung der Ergebnisse ab.
Ich hatte kurzzeitig überlegt, das durch ein Flag steuerbar zu machen, aber das gestaltete sich als zu unübersichtlich. Ich sah da nur die Möglichkeit 2 unterschiedliche Bewertungsfunktionen zu implementieren. Die habe ich aber erstmal zurück gestellt, da mir der Nutzen im Verhältnis zum Aufwand zu gering erschien.
Wenn ich es annähernd richtig verstehe, geht es Dir hier um die Frage, ob eine letzte Zeile ohne "\n" am Ende noch eine Zeile ist ?
Das war der eigentliche Auslöser, abgesehen davon das allein die Eingabe des Suchmusters die ursprüngliche Programmversion in eine Endlosschleife getrieben hatte. Ich habe da eine Sammlung von kurzen Text Dateien (etwa 5000) die von anderen Programmen weiter verarbeitet und ergänzt werden. Wenn da beim Ergänzen mal zusätzliche Leerzeilen erzeugt werden und mal nicht, ist das beim Endergebnis von der Optik eher störend.
Mit "Bewertung der Treffer" meine ich, das der Anwender sich überlegen muss, ob es sich bei einem Treffer, bei dem der gefundene Start-Offset, der hinter der Textlänge liegt, um ein gültiges Ergebnis handelt. Das währe nur der Fall, wenn die letzte Zeile "xxx\n" auch als Leerzeile bewerten will.
Das sind wirklich 2 unterschiedliche Betrachtungsweisen, die nicht so einfach unter einen Hut zu bringen sind und darüber muss man sich als Programmierer erstmal klar werden, da dies aus der Doku nicht sofort ersichtlich ist (die meisten Beispielprogramme suchen ja nur nach einem Treffer, ohne diesen, wie in einem Texteditor, anzeigen zu wollen oder danach eine Fortsetzung der Suche zu wollen).
In meinen Anwendungen gehe ich erstmal davon aus, das die letzte Zeile, die mit "xx\n" endet, nicht leer ist und nicht von einer leeren Zeile verfolgt wird. Anderenfalls hätte ich ca. 98% Treffer.