Suche nach regulären Ausdrücken in Sublime Text 2 ersetzen

440

Ich möchte die Suche durch reguläre Ausdrücke in Sublime Text 2 ersetzen. Die Dokumentation dazu ist ziemlich anämisch. Insbesondere möchte ich Gruppen ersetzen, also so etwas wie das Konvertieren dieses Textes:

Hello my name is bob

Und dieser Suchbegriff:

Finde was: my name is (\w)+

Ersetzen mit: my name used to be $(1)

Der Suchbegriff funktioniert einwandfrei, aber ich kann keine Möglichkeit finden, mithilfe der Regexp-Gruppe tatsächlich zu ersetzen.

Hackerhasid
quelle

Antworten:

583

Normalerweise ist eine Rückreferenz entweder $1oder \1(Backslash eins) für die erste Erfassungsgruppe (die erste Übereinstimmung eines Musters in Klammern), und tatsächlich unterstützt Sublime beide Syntaxen. Also versuche:

my name used to be \1

oder

my name used to be $1

Beachten Sie auch, dass Ihr ursprüngliches Erfassungsmuster:

my name is (\w)+

ist falsch und erfasst nur den letzten Buchstaben des Namens und nicht den gesamten Namen. Sie sollten das folgende Muster verwenden, um alle Buchstaben des Namens zu erfassen:

my name is (\w+)
Bobulous
quelle
15
außer, ist es nicht $0?
Skylar Saveland
11
Nein, $ 0 wird in einem regulären Ausdruck nicht als Rückverweis verwendet (da dies \0dem Nullzeichen entspricht und \0dddals Escapezeichen für ein Zeichen mit dem Codepunkt ddd verwendet wird). Allerdings $0scheint in Sublime2 als „exit Marke“ nach verwendet werden sollte diese Seite (obwohl ich Probleme bei der Suche genug Beispiele habe genau ausrechnen , wie eine Ausfahrt Markierung in Sublime2 verwendet).
Bobulous
3
Die Exit-Markierung $0wird in Sublime Text 2/3 verwendet, um den Cursor beim Beenden einer Snippet-Erweiterung zu platzieren. Mehr zu Schnipsel .
jrhorn424
2
$ 0 funktioniert immer noch für die Rückreferenzierung des gesamten Ausdrucks in Sublime Text 2
Sturrockad
2
$0ist das gesamte Regex-Match; $1ist die erste Erfassungsgruppe.
Oletha
103

Übrigens in der obigen Frage:

Zum:

Hello, my name is bob

Teil finden:

my name is (\w)+

Mit Ersatzteil:

my name used to be \1

Würde zurückkehren:

Hello, my name used to be b

Ändern Sie den Find-Teil in:

my name is (\w+)

Und ersetzen wird das sein, was Sie erwarten:

Hello, my name used to be bob

Während (\ w) + mit "bob" übereinstimmt, ist es nicht die Gruppierung, die Sie ersetzen möchten.

CrnaStena
quelle
52

Wichtig: Verwenden Sie die ( )Klammern in Ihrer Suchzeichenfolge

Während die vorherige Antwort richtig ist, gibt es eine wichtige Sache zu betonen! Alle die passenden Segmente in Ihrem Suchbegriff , den Sie verwenden in Ihrer wollen Ersatzzeichenfolge muss von einem geschlossenen ( )Klammern , ansonsten diese passenden Segmente werden nicht an definierten Variablen zugänglich sein wie $1, $2oder \1, \2usw.

Zum Beispiel möchten wir 'em' durch 'px' ersetzen, aber die Ziffernwerte beibehalten:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Ersatzzeichenfolge: margin: $1pxodermargin: \1px
  • Suchzeichenfolge (RICHTIG): margin: ([0-9]*)em// mit Klammern
  • Suchzeichenfolge (INCORRECT): margin: [0-9]*em

BEISPIEL FÜR RICHTIGEN FALL: Verwenden einer Suchzeichenfolgemargin: ([0-9]*)em (in Klammern). Schließen Sie das gewünschte übereinstimmende Segment (z. B. $1oder \1) ( )wie folgt in Klammern ein:

  • Suchen: margin: ([0-9]*)em(mit Klammern)
  • Ersetzen durch: margin: $1pxodermargin: \1px
  • Ergebnis:
    margin: 10px;
    margin: 2px;

FALSCHES FALLBEISPIEL: Verwenden einer margin: [0-9]*emSuchzeichenfolge (ohne Klammern). Das folgende Regex-Muster stimmt mit den gewünschten Zeilen überein, aber übereinstimmende Segmente sind in der ersetzten Zeichenfolge nicht als Variablen wie $1oder verfügbar \1:

  • Suchen: margin: [0-9]*em(ohne Klammern)
  • Ersetzen durch: margin: $1pxodermargin: \1px
  • Ergebnis:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */
Hrvoje Golcic
quelle
1
Vielen Dank, diese Antwort weist wirklich auf eine interessante Tatsache hin, die mein Problem gelöst hat.
Enkk
Vielen Dank für den Hinweis. Mit () kann ich in Sublime 3 durch \ 1 ersetzen.
Jeffrey
47

Hier ist eine visuelle Darstellung der genehmigten Antwort.

Geben Sie hier die Bildbeschreibung ein

Zeeawan
quelle
warum nicht finden $_SESSION[(\w+)? danke
Toni Michel Caubet
Da $, [, (und) Sonderzeichen sind, sollten Sie jedes Sonderzeichen mit einem Backslash maskieren.
Zeeawan
25

Beachten Sie, dass Sie bei Verwendung von mehr als 9 Erfassungsgruppen die Syntax verwenden müssen ${10}.

$10oder \10oder \{10}wird nicht funktionieren.

Andreas Haferburg
quelle
Vielen Dank! Dies war hilfreich für mich, um eine Zahl am Ende der erfassten Gruppe zu ersetzen und hinzuzufügen, z. B. um eine 1an die zweite Erfassungsgruppe anzuhängen, für die Sie geschweifte Klammern wie verwenden müssen ${2}1. $ 21 bezieht sich auf die 21. Erfassungsgruppe, die nicht existiert.
Eric
1

Wenn Sie sich den Artikel von Sublime Text Inofficial Documentation über Suchen und Ersetzen ansehen , sieht es so aus, als wäre +(.+)es die gewünschte Erfassungsgruppe ... aber ich persönlich habe sie verwendet (.*)und sie hat gut funktioniert. Um die Art und Weise zu ersetzen, wie Sie es sagen, könnte Ihnen diese Konversation in den Foren gefallen , insbesondere in diesem Beitrag, in dem es heißt, einfach $1die erste erfasste Gruppe zu verwenden.

Und da Bilder besser sind als Worte ...

Vor: vor dem Suchen / Ersetzen

Nach: nach suchen / ersetzen

Blairg23
quelle