Eclipse, Suche und Ersetzung von regulären Ausdrücken


119

Ist es in Eclipse möglich, die übereinstimmende Suchzeichenfolge als Teil der Ersetzungszeichenfolge zu verwenden, wenn eine Suche und Ersetzung für reguläre Ausdrücke durchgeführt wird?

Grundsätzlich möchte ich alle Vorkommen von ersetzen

variableName.someMethod()

mit:

((TypeName)variableName.someMethod())

Wobei Variablenname ein beliebiger Variablenname sein kann.

In sed könnte ich so etwas gebrauchen wie:

s/[a-zA-Z]+\.someMethod\(\)/((TypeName)&)/g

Das heißt, & repräsentiert die übereinstimmende Suchzeichenfolge. Gibt es etwas Ähnliches in Eclipse?

Vielen Dank!


Gute Dokumentation zu Eclipse RegEx: help.eclipse.org/kepler/…
Kolob Canyon

Antworten:


225

Ja, "()" erfasst eine Gruppe. Sie können es wieder mit $ i verwenden, wobei i die i-te Erfassungsgruppe ist.

So:

Suche: (\w+\.someMethod\(\))

ersetzen: ((TypeName)$1)

Hinweis: CTRL+ Spacein den Textfeldern gibt Ihnen alle möglichen Vorschläge für das Schreiben regulärer Ausdrücke.


Das ist eine schöne Antwort und ein nützlicher Hinweis. Es wäre hilfreicher gewesen, wenn es etwas detaillierter beschrieben worden wäre.
Iammilind

Bravo Eclipse, Sie haben diese Funktion richtig implementiert!
Kenogu Labz

Ich liebe besonders das Beispiel für "Hex-Code für Unicode-Zeichen" :)
Stewart Murrie

Ich möchte einen Code hinzufügen, der mir wirklich geholfen hat. Ich musste jeden stringVar.equals("xxx")durch ersetzen "xxx".equals(stringVar). Ich habe im Dialogfeld Suchen / Ersetzen den folgenden regulären Ausdruck verwendet: search: ([^()! ]+).equals\("(.*)"\), replace: "$2".equals\($1\).
LaDude

Nicht für mich. Ersetzt immer die erste Gruppe ...?
RightmireM

6

Verwenden von ...
search = (^. * Import) (. *) (\ (. * \) :)
replace = $ 1 $ 2

... ersetzt ...

from checks import checklist(_list):

...mit...

from checks import checklist



Blöcke in Regex werden durch Klammern abgegrenzt (denen kein "\" vorangestellt ist)

(^. * Import) findet "von Schecks importieren" und lädt es auf $ 1 (Eclipse beginnt bei 1 zu zählen)

(. *) Finde das nächste ". alles "bis zur nächsten Begegnung" ("und lädt es auf $ 2. $ 2 stoppt bei" ("wegen des nächsten Teils (siehe nächste Zeile unten)

(\ (. * \) :) sagt" bei der ersten Begegnung "(). ( ' einen beliebigen Text') ". nach Block $ 2 ... Anschlagblock $ 2 beginnen und starten 3 $ 3 $ mit dem geladen wird ":" oder, im Beispiel die "(_list):"

Dann in der ersetzen, setzen Sie einfach die $ 1 $ 2, um alle drei Blöcke durch nur die ersten beiden zu ersetzen.



Bildschirmfoto


3

NomeN hat richtig geantwortet, aber diese Antwort wäre für Anfänger wie mich nicht von großem Nutzen, da wir ein weiteres Problem lösen müssen und nicht wissen, wie wir RegEx dort verwenden sollen. Deshalb füge ich dem eine Erklärung hinzu. Die Antwort ist

Suche: (\ w + \. someMethod \ (\))

ersetzen: ((TypeName) $ 1)

Hier:

Auf der Suche:

  • Das erste und letzte '(' ')' zeigt eine Gruppe in Regex

  • '\ w' zeigt Wörter (alphanumerisch + Unterstrich)

  • '+' zeigt einen oder mehrere (dh einen oder mehrere alphanumerische + Unterstriche)

  • '.' ist ein Sonderzeichen, das ein beliebiges Zeichen darstellt (dh + bedeutet eines oder mehrere Zeichen). Weil dies ein Sonderzeichen ist, um ein '.' wir sollten damit einen Fluchtcharakter geben, dh '.'

  • 'someMethod' wird so angegeben, wie es durchsucht werden soll.

  • Die beiden Klammern '(', ')' werden zusammen mit dem Escape-Zeichen angegeben, da es sich um Sonderzeichen handelt, die zur Darstellung einer Gruppe verwendet werden (wir werden im nächsten Punkt auf die Gruppe eingehen).

In ersetzen:

  • Es wird ' ((TypeName) $ 1) ' angegeben, hier zeigt $ 1 die Gruppe. Das sind alle Zeichen, die in der ersten und letzten Klammer '(', ')' im Suchfeld eingeschlossen sind

  • Stellen Sie außerdem sicher, dass Sie die Option "Regulärer Ausdruck" aktiviert haben, um ein Ersetzungsfeld zu finden

Weitere Informationen zu RegEx finden Sie unter http://regexr.com/ .


2

Zumindest bei STS (SpringSource Tool Suite) sind die Gruppen ab 0 nummeriert, daher wird die Zeichenfolge ersetzt

replace: ((TypeName)$0)

5
Das ist nicht wahr afaik. Die $ 0 steht für den gesamten ursprünglichen Suchbegriff. In diesem Fall würde das allerdings zufällig funktionieren.
Walter Heck

0

Für jemanden, der eine Erklärung und ein Beispiel für die Verwendung eines Regxp in Eclipse benötigt. Hier ist mein Beispiel, das das Problem veranschaulicht.

Geben Sie hier die Bildbeschreibung ein

Ich möchte umbenennen

/download.mp4^lecture_id=271

zu

/271.mp4

Und davon kann es mehrere geben.

Hier ist, wie es gemacht werden sollte.

Geben Sie hier die Bildbeschreibung ein

Klicken Sie dann auf die Schaltfläche Suchen / Ersetzen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.