Die Indesign-GREP-Suche enthält zu viel

Es macht mich wahnsinnig und ich habe keine Ahnung, was ich falsch mache. In meinem Dokument muss ich einige reguläre Ausdrücke in und einschließlich der Klammern automatisch formatieren.

Ein Beispiel ist hier;

[DP, 07.04.1911, „Protestanten“]

DP könnte auch BSZ sein, das Datum variiert und die Zeichenfolge in den Anführungszeichen auch.

Ich habe folgenden grep-Ausdruck versucht:

\[(DP|BSZ)(.*)\]

Dies funktioniert in allen Fällen, in denen es nur eine solche Sequenz im Absatz gibt. Wenn es eine zweite gibt, beginnt sie mit der öffnenden Klammer der ersten Sequenz und stoppt nach der schließenden Klammer der zweiten, und alles zwischen diesen Sequenzen wird ebenfalls ausgewählt.

Was mache ich falsch? Ich habe versucht, das schließende Anführungszeichen als Stopp zu verwenden, aber es ergibt das gleiche Ergebnis. Hier ist der grep-Ausdruck:

\[(DP|BSZ)(.*)(“*?)\]

Schneller Kommentar .*ist gierig. Es wird also auch mit dem übereinstimmen, was danach kommt, wenn es irgendwo im Text ein zweites Vorkommen dessen gibt, was danach kommt. Versuchen Sie .*?es stattdessen

Antworten (1)

Standardmäßig ist GREP gierig : Solange weiter unten eine Übereinstimmung gefunden werden kann, wird es so viel wie möglich greifen. Da das .(standardmäßig) nicht mit einem harten Zeilenumbruch übereinstimmt, wird es normalerweise bis zum Ende eines Absatzes gescannt. Wenn Sie den 'Einzelzeilenmodus' mit aktivieren (?s), passt der .Platzhalter sogar zu harten Zeilenumbrüchen und versucht so, bis zum Ende Ihres Textes auszuwählen.

Um dem entgegenzuwirken, gibt es zwei mögliche Tricks. Zunächst einmal wird nicht das einfache "match-anything" verwendet, .sondern eine Negation des Endzeichens:

\[(DP|BSZ)[^]]*\]

Dadurch wird jede Folge von "Nicht- ]Zeichen" ausgewählt und somit beim ersten Auftreten von angehalten ], wonach es mit dem nächsten Zeichen übereinstimmt, das immer das nächste ist ].

Ein üblicherer Weg ist jedoch, GREP anzuweisen, die kürzestmögliche Übereinstimmung zu verwenden, anstatt die standardmäßig längstmögliche . Dies geschieht durch Hinzufügen des zusätzlichen Modifikators ?nach einem der „Wiederholungs“-Codes ?, +, *oder {x,y}. In Ihrem Fall wäre dies

\[(DP|BSZ)(.*?)\]

Beachten Sie, dass die runden Klammern ganz rechts nicht erforderlich sind, um nur den Text in eckigen Klammern zu formatieren. Sie können einfach verwenden

\[(DP|BSZ).*?\]

weil die Mengenmodifikatoren nur auf die unmittelbar vorangehende Gruppe ( (a|b)), Zeichenklasse ( [abc]) oder (in diesem Fall) Einzelzeichen oder Einzelzeichencode wirken.

Klappt wunderbar! Vielen Dank...