Nach einigem Nachdenken und Reflektieren muss ich jetzt feststellen, dass ich/wir den Schwanz mit dem Hund haben wedeln lassen.
Der eigentliche Fehler liegt nicht darin, dass sich das Caret-Zeichen ^ nicht auf den Absatzbeginn beschränkt und darüberhinaus auch den Beginn einer neuen Zeile berücksichtigt. Nein, der eigentliche Fehler liegt darin, dass Adobe diese Positionsmarke ^ als "Absatzbeginn" bezeichnet bzw. der Begriff "Absatzbeginn" eine gewisse Unschärfe in sich trägt. Und da diese Marke auch Positionen finden, die nicht Absatzbeginn sind, sondern Zeilenbeginn, weisen wir zu Recht auf eine Differenz zwischen Bezeichnung und Wirkung hin.
Unter einem Absatz verstehen wir eine Texteinheit, die zwischen bestimmten Begrenzern eingeschlossen ist:
– zwei Absatzschaltungen (RETURNs)
– Textanfang + Absatzschaltung
– Absatzschaltung + Textende
– Textanfang + Textende
(theoretisch könnte man nun auch die Trennung von Text durch Shift-Return [ein besonderes Return] als ein "Absetzen" = einen Absatz verstehen)
Computertechnisch hat sich diese "Sinneinheit" aus Begrifflichkeiten um die Schreibmaschine und den Telegrafen entwickelt: Wagenrücklauf (carriage return, cr) und Zeilenvorschub (line feed, lf).
Bei der Schreibmaschine war noch jede neue Zeile mit Beginn im Bereich des linken Rands mit einem handgreiflich verursachten Wagenrücklauf in Gemeinschaft mit einem Zeilenvorschub verbunden. Ein Absatz ("ab-setzen", hervorheben) wurde daraus erst mit einer besonderen Gestaltung: (Erst-)Zeileneinzug bzw. Leerzeile (vergrößerter Zeilenvorschub).
Tatsächlich war aber unter diesen mechanischen Bedingungen jede Zeile – unabhängig ob neuer Absatz oder nur neue Zeile – mit einem Zeilenvorschub verbunden.
Auf dem Computer haben sich mit verschiedenen Betriebssystemen dann unterschiedliche Bezeichnungen und Codierungen für den Zeilenvorschub entwickelt:
In den verschiedenen Betriebssystemen wurde aber uneinheitlich verfahren. Bei manchen wurde die Interpretation der typografischen Absatzmarke (¶ Pilcrow) durch die Zeichenkette CR LF (entspricht ASCII 0x0D 0x0A) unverändert weitergenutzt – so etwa bei CP/M, DOS und Windows (und damit auch in Texteditoren wie Notepad) – bei anderen, namentlich Unix und Unix-artigen Systemen, wurde dieser auf das einzelne Zeichen LF Line Feed (den hier thematisierten Zeilenvorschub) gekürzt, unter klassischem Mac OS hingegen auf das einzelne Zeichen CR Carriage Return (den Wagenrücklauf). Und wieder andere Systeme kennen ein eigenes Zeichen NL oder NEL (engl. für New Line oder Next Line) oder ein Zeichen EOL (engl. für End of Line). Aus diesem Grund ist der Austausch von Textdateien zwischen unterschiedlichen Betriebssystemen erheblich erschwert. Viele Programme (zum Beispiel Browser) akzeptieren daher jedes dieser Steuerzeichen als Zeilenvorschub, auch wenn dies technisch nicht ganz korrekt ist. In anderen Programmen unterscheiden CR und LF das Absatzende ¶ und den harten Zeilenumbruch _| oder den Spaltenumbruch.
Langer Rede kurzer Sinn:
^ sucht nicht nach einem
Absatzbeginn, wie die Bezeichnung, die Adobe dafür gewählt hat, nahelegt, sondern nach einem per Tastatur vorgenommenen
Zeilenbeginn - egal ob nun ein Return oder ein Shift-Return eingegeben wurde.
Insofern führt die GREP-Suche genau das aus, wofür das ^ im Kontext der regulären Ausdrücke steht:
Position Zeilenanfang. Wobei dieser "Zeilenanfang" nicht jeden Zeilenanfang (weicher Umbruch) einschließt, sondern nur solche, die durch ein entsprechendes Zeichen (Return oder Shift-Return) oder durch den "Textbeginn" veranlasst wurden.
Der Fehler liegt also nicht in der tatsächlichen Wirkung,
sondern in der irreführenden Bezeichnung.
Insofern stellen die beiden Ausdrücke
(?
und
.$(?!\n)
nicht eine überflüssige oder vermeidbare Umschweife dar, sondern vielmehr eine Präzisierung/Vergenauerung des Zeilenvorschubzeichens (nicht nach/vor dem \n; also nur nach dem damit verbleibenden \r).
Für die lange Ausführung bitte ich um Entschuldigung. Mitunter bedarf es eines weiten Rundumschlags, um sich selbst von falschen Überzeugungen zu befreien. ;-)
(Konsequenterweise müsste ich eigentlich meinen Bugreport jetzt löschen oder die o.g. Ausführungen dorthin übersetzen lassen. Denn u.U. bedeutete eine Änderung der Wirkung von ^ einen Fehler im Hinblick auf die Konventionen andernorts ... Was tun?)