Grep: Suche zwischen "Beginn eines Absatzes" und Doppelpunkt :

Ich versuche, einen Stil auf eine Reihe von Wörtern anzuwenden, die am Anfang eines Absatzes und vor einem Doppelpunkt stehen.

Ich habe eine erste Grep-Suche vorbereitet, aber es funktioniert nicht (es setzt nur den Cursor vor den Doppelpunkt, ohne etwas auszuwählen ...

(?=^)*?(?=\:)

Irgendeine Idee?

Antworten (1)

Am Anfang hast du (?=^). Eine positive Vorausschau , die nach vorne schaut, um zu sehen, ob ein Absatzanfang nach dem Text kommt , den Sie vor der Vorausschau haben (in diesem Fall keiner). Dann haben Sie *?die Suchanfragen für Null oder mehr Male (kürzeste Übereinstimmung) dieses positiven Lookahead . Es ist ein bisschen missgebildet. Sie wählen nicht wirklich irgendwelche Charaktere aus.

Damit Ihr Ansatz funktioniert, müssten Sie ein positives Lookbehind (?<=^) verwenden , das nach hinten schaut, um zu sehen, ob ein Absatzanfang vor dem Text steht , ohne ihn auszuwählen. Verwenden Sie dann .*?, um ein beliebiges Zeichen null oder mehrmals (kürzeste Übereinstimmung) und eine positive Vorausschau (?=:) auszuwählen , um die Auswahl vor einem Doppelpunkt zu beenden:

(?<=^).*?(?=:)

Aber man kann es einfacher schreiben. ^ist immer nicht übereinstimmend, also brauchen Sie das Lookbehind nicht:

^.*?(?=:)

^selbst ist nicht passend, also ist es überhaupt nicht notwendig, ein Lookbehind durchzuführen – tatsächlich hätte ich nicht gedacht, dass ein Lookbehind für a ^überhaupt funktionieren würde. Ihre Version wird jedoch auch mit nicht initialen Zeichenfolgen übereinstimmen (dh, wenn es zwei Doppelpunkte gibt, wird sie mit der Zeichenfolge dazwischen übereinstimmen), also ^wird a benötigt. *?ist vollkommen gültig: Es ist ein nicht-gieriger Wildcard-Match. Sie könnten dies sogar verwenden, um die Abfrage etwas einfacher zu gestalten: ^.*?:stimmt mit dem überein ^[^:]*:(einschließlich Doppelpunkt) und ^.*?(?=:)stimmt mit dem überein ^[^:]*(?=:)(mit dem zusätzlichen ^).
Ich vermute, der Grund, warum die ursprüngliche Abfrage den Cursor nur vor den Doppelpunkt setzt, ist, dass (?=^)per Definition nichts übereinstimmen kann, aber anscheinend syntaktisch nicht ungültig ist, also einer leeren, nicht übereinstimmenden Gruppe entspricht. Diese leere Gruppe (= alles, was keine nicht leere Übereinstimmung ist, dh jede Position zwischen Zeichen) wird dann nicht gierig abgeglichen bis zu einer Position, an der ein Doppelpunkt folgt (aus dem Lookahead) – das heißt, die Position zwischen Doppelpunkt und das unmittelbar davor stehende Zeichen. Definitiv keine normale Verwendung von GREP!
@JanusBahsJacquet, die Verwendung des nicht gierigen Platzhalters ist nett, aber ich verstehe nicht, warum Sie am Anfang *?das Bedürfnis verspüren . ^Für mich scheint das .*?(?=:)genauso gut zu funktionieren wie ^.*?(?=:). Sehen Sie hier und beachten Sie, dass die Zeichenfolge zwischen den Doppelpunkten nicht ausgewählt wird. Übersehe ich etwas?
@JanusBahsJacquet, und bitte, wenn ich in meiner Antwort etwas Falsches über GREP sage, zögern Sie nicht, es zu beheben!
Das ist in einem GREP- Stil , der nur einmal pro Absatz übereinstimmt. Die Frage erwähnt eine GREP- Suche , die mehrmals pro Absatz übereinstimmt (es sei denn, die Abfrage enthält $natürlich eine Absatzmarke oder ). Wenn Sie mit derselben Abfrage alle suchen/ersetzen, sollte auch die Zeichenfolge zwischen den Doppelpunkten übereinstimmen.
@JanusBahsJacquet, Hoppla! Ich verstehe. Meine Antwort ist dann ein Durcheinander.
@JanusBahsJacquet, ich habe es bearbeitet. Ist es jetzt richtig?
Sieht gut für mich aus!