Suchen und Ersetzen von C # -Ausdruck

8

Immer wieder muss ich die Verwendung eines Methodenaufrufs durch einen anderen ändern.

z. Ich habe 100 ähnliche Methodenaufrufe wie folgt:

%Vor%

, die zu

geändert werden müssen %Vor%

Dies ist relativ einfach mit einem regulären Ausdruck zu lösen. Aber was, wenn whitespace (manchmal) ins Spiel kommt?

%Vor%

Immer noch mit einer Regex machbar, aber es ist jetzt ein unlesbares Durcheinander von optionalen Leerzeichen-Tokens.

OK, aber was ist, wenn die Parameter nicht immer einfache Bezeichner sind, sondern beliebige Ausdrücke ?

%Vor%

Hier kommen reguläre Ausdrücke wirklich zusammen.

Meine Frage ist:

Kann das heute gemacht werden? (in einer Weise, die Sie gesund, d. h. ohne Regex hält)

Gibt es eine VS-Erweiterung oder ein Standalone-Tool, mit dem C # -Code auf einer höheren (semantischen) Ebene gesucht und ersetzt werden kann?

Etwas, was es mir erlauben würde zu suchen (ich stelle mir vor):

%Vor%

und ersetzen durch

%Vor%

Existiert ein solches Werkzeug für C #? (Ich kann mir vorstellen, dass es um Roslyn herum gebaut werden könnte.)

    
Cristi Diaconescu 12.06.2015, 07:29
quelle

3 Antworten

1

Nachdem Sie noch einmal darüber nachgedacht haben, was Sie erreichen wollen, ist gefährlich und besser zu vermeiden. Eine RegEx-Übereinstimmung / Ersetzen ist eine eingeschränkte Funktion. Es kann komplexen Code nicht "verstehen" und muss zwangsläufig fehlschlagen. Betrachten Sie ein Beispiel wie (lassen Sie es für eine Sekunde ignorieren, wenn dieser Code sogar Sinn macht):

Helper.GetIntFromData(packetData.Skip(skipArray.Take(1)).Take(length).ToArray());

Ein regulärer Ausdruck, der nicht speziell darauf zugeschnitten ist, das "falsche Take " zu vermeiden, hat keine Chance. Es ist eine Frage der Zeit, bis Ihre automatische Ersetzungs-Methode Ihren Code durchbricht, und Ihre einzige Hoffnung ist, dass sie brutal genug ist, um einen Fehler bei der Kompilierung zu erzeugen. Es kann genauso gut eine Runtime-Ausnahme oder ein ungeklärtes Verhalten verursachen. Code-Refactoring sollte mit einem Werkzeug durchgeführt werden, das Code versteht, und nicht ein Werkzeug, das Textmuster erkennt.

    
Amit 12.06.2015 07:58
quelle
1

Resharper hat semantische Suche und ersetzen

%Vor%

mit

%Vor%

Es ist weißraumunempfindlich und Sie können festlegen, dass die Tokenübereinstimmungen bestimmten Typen entsprechen. Ich benutze es die ganze Zeit, um zu tun, was du versuchst zu tun. Ich habe noch keine roslyn-basierten Projekte gesehen, die alle Benutzer so trivial machen.

Hier finden Sie eine Einführung in die Funktion auf der Website von Resharpers

Ссылка

    
bradgonesurfing 16.06.2015 05:04
quelle
0

Wenn es mir möglich wäre, würde ich es "manuell" machen, aber mit einfachen Regexen (ja, ich weiß, dass du ohne sie gesagt hast, und Amits Antwort "sieht richtig aus", obwohl ich es nicht für Randfälle überprüft habe).

In etwa so:

%Vor%

Ersetzen Sie (Helper.GetIntFromData.*?)\.Skip\( durch , , um

zu erhalten %Vor%

Ersetzen Sie dann (Helper.GetIntFromData.*?)\)\.Take\( durch , , um

zu erhalten %Vor%

Und schließlich ersetzen Sie (Helper.GetIntFromData.*?)\)\.ToArray\(\)\); durch \); , um

zu erhalten %Vor%     
ClickRick 12.06.2015 08:54
quelle

Tags und Links