2016-04-18 10 views
-1

Ich benutze TextMate, um Ausdruck [my_expression] zu ersetzen, die in Zeichen zwischen offenen und geschlossenen Klammern durch {my_expression}; so habe ich versucht,Ersetzen mit Rückverweis in TextMate Problem

\[[^]]*\] 

von

{$1} 

Die Regex passt den richtigen Ausdruck zu ersetzen, aber der Ersatz gibt {$1}, so dass die Variable nicht erkannt wird. Kann jemand eine Idee haben?

\[([^\]]*)\] 

Die $1 ist ein Rückreferenzierung auf den mit [...] geschlossenen Text:

+0

Sie haben vergessen, einen Charakter zu entkommen , benutze '\ [[^ \]] * \]'. Sie brauchen auch eine Capture-Gruppe, also benutzen Sie '\ [([^ \]] *) \]' – Druzion

+0

Escape-']' ist nicht erforderlich, obwohl – rock321987

+0

Sie können Ihre Regex zu \ [(. *?) \] Vereinfachen. das ? nachdem das * macht es nicht gierig, da ich [^]] ist ein bisschen schwer auf die Augen ... und ja, Sie müssen die() eine Erfassungsgruppe angeben, die TextMate erkennen kann – karina

Antwort

2

Sie haben vergessen, einen Charakter zu entkommen, sollte [^]][^\]] sein.

Sie benötigen auch eine Erfassungsgruppe. $1 ist back-referencing die 1st Capture-Gruppe, und Sie keine Capture-Gruppen hatten, so verwenden Sie die folgende Regex:

\[([^\]]*)\] 

Dies fügt () um [^\]]*, so dass die Daten innerhalb des [] erfasst wird.Weitere Informationen finden Sie auf dieser Seite auf Capture Groups


Dies ist jedoch RegEx kürzer:

\[(.*?)\] 

Substitution auch mit {$1}

Live Demo on Regex101

1

eine Erfassungsgruppe (...) verwenden.

Hier ist die regex demo und auch Numbered Backreferences.

Auch die TextMate docs:

1. Syntaxelemente
    (...) Gruppe

20.4.1 Captures
ein Capture referenzieren, $n verwenden, wobei n die Capture-Registernummer. Verwenden Sie $0 bedeutet das gesamte Spiel.

Und auch:

  • Wenn Sie [, -, ] als normale Zeichen in einer Zeichenklasse verwenden, sollten Sie diese Zeichen durch \ entkommen.