Visual Studio regex zu entfernen Sie alle Kommentare und leere Zeilen in VB.NET code mithilfe von Makros
Ich habe versucht, entfernen Sie alle Kommentare und leere Zeilen in einer Datei mit Hilfe eines Makros. Nun kam ich mit dieser Lösung, die löscht die Kommentare(es gibt einige bug unten beschrieben), ist aber nicht in der Lage, löschen Sie die leeren Zeilen dazwischen -
Sub CleanCode()
Dim regexComment As String = "(REM [\d\D]*?[\r\n])|(?<SL>\'[\d\D]*?[\r\n])"
Dim regexBlank As String = "^[\s|\t]*$\n"
Dim replace As String = ""
Dim selection As EnvDTE.TextSelection = DTE.ActiveDocument.Selection
Dim editPoint As EnvDTE.EditPoint
selection.StartOfDocument()
selection.EndOfDocument(True)
DTE.UndoContext.Open("Custom regex replace")
Try
Dim content As String = selection.Text
Dim resultComment As String = System.Text.RegularExpressions.Regex.Replace(content, regexComment, replace)
Dim resultBlank As String = System.Text.RegularExpressions.Regex.Replace(resultComment, regexBlank, replace)
selection.Delete()
selection.Collapse()
Dim ed As EditPoint = selection.TopPoint.CreateEditPoint()
ed.Insert(resultBlank)
Catch ex As Exception
DTE.StatusBar.Text = "Regex Find/Replace could not complete"
Finally
DTE.UndoContext.Close()
DTE.StatusBar.Text = "Regex Find/Replace complete"
End Try
End Sub
So, hier ist das, was es soll sieht aus wie vor und nach dem ausführen des Makros.
VOR
Public Class Class1
Public Sub New()
''asdasdas
Dim a As String = "" ''asdasd
''' asd ad asd
End Sub
Public Sub New(ByVal strg As String)
Dim a As String = ""
End Sub
End Class
NACH
Public Class Class1
Public Sub New()
Dim a As String = ""
End Sub
Public Sub New(ByVal strg As String)
Dim a As String = ""
End Sub
End Class
Gibt es vor allem zwei Hauptprobleme, die mit dem makro
- Es kann nicht löschen Sie die leeren Zeilen dazwischen.
- Wenn es ein Stück code, das geht so
Dim a as String = "Name='Soham'"
Dann Nach dem ausführen des Makros wird es
Dim a as String = "Name='"
Du musst angemeldet sein, um einen Kommentar abzugeben.
To get rid von einer Zeile mit Leerzeichen oder nichts, Sie können mit diesem regex:
Ihre regex -
^[\s|\t]*$\n
funktionieren würde, wenn Sie angegeben Multiline-Modus ((?m)
), aber es ist immer noch falsch. Für eine Sache, die|
entspricht einem literal|
; es gibt keine Notwendigkeit zu geben "oder" in einer Charakter-Klasse. Zum anderen\s
entspricht einem beliebigen whitespace-Zeichen, einschließlich TAB (\t
), carriage-return (\r
) und Zeilenvorschub (\n
), so dass es unnötig redundant und ineffizient. Zum Beispiel, bei der ersten leeren Zeile (nach dem Ende des erstenSub
), die^[\s|\t]*
wird zunächst versuchen, alles, was vor dem WortPublic
, dann wird es wieder nach dem Ende der vorherigen Zeile, wo die$\n
mithalten können.Aber eine leere Zeile, zusätzlich zu leer oder nur mit horizontalen Leerraum (Leerzeichen oder Tabulatoren), kann auch einen Kommentar enthalten. Ich wähle zur Behandlung dieser "comment-only" - Zeilen als Leerzeilen, da es relativ einfach zu tun, und es vereinfacht die Aufgabe, passende Kommentare in nicht-leeren Zeilen, die ist viel härter. Hier ist meine regex:
Nach dem Verzehr eines führenden horizontalen Leerräume, wenn ich sehe, dass eine
REM
oder'
bedeutet ein Kommentar, ich konsumiere das alles danach, bis die nächste Zeile Trennzeichen. Beachten Sie, dass die einzige Sache, die vorhanden sein muss, ist der line separator selbst. Beachten Sie auch das fehlen der Ende-Anker,$
. Es ist nie notwendig, wenn Sie ausdrücklich matching die Linie Separatoren, und Sie würde in diesem Fall brechen Sie die regex. Im Multiline-Modus,$
Spiele nur vor einem Zeilenvorschub (\n
), nicht vor einem carriage-return (\r
). (Dieses Verhalten des .NET-Geschmack ist falsche und eher überraschend, da Microsoft die langjährige Vorliebe für\r\n
als line-Trenner.)Passend zu den restlichen Kommentaren ist eine grundlegend andere Aufgabe. Als Sie entdeckt habe, einfach auf der Suche nach
REM
oder'
ist nicht gut, weil es vielleicht in einem string-literal, wo es bedeutet nicht den Beginn eines Kommentars. Was Sie tun müssen ist, starten aus dem Anfang der Zeile, Konsum und die Erfassung alles, was nicht den Beginn eines Kommentars oder ein string-literal. Wenn Sie ein doppeltes Anführungszeichen verwendet, gehen Sie vor und nutzen die string-literal. Wenn Sie einenREM
oder'
, stoppen Sie die Aufnahme und gehen Sie Voraus und verbrauchen Sie den rest der Zeile. Dann ersetzen Sie die gesamte Zeile nur den Teil erfasst, D. H., alles, was vor dem Kommentar. Hier der regex:Oder, mehr gut lesbar:
Die Ersatz-Zeichenfolge wäre
"${line}"
. Einige andere Notizen:[\r\n]+
zu konsumieren, die line-separator, wie die "Leerzeilen" regex tut.$
entweder aus dem gleichen Grund wie vorher. Die[^\r\n]*
wird gierig konsumieren alles, was vor der Zeile ein Trennzeichen, so dass der Anker nicht erforderlich.REM
oder'
; wir uns nicht die Mühe matching-jede Zeile, die nicht enthalten einen Kommentar.(...)
statt(?:...)
für alle Gruppen, die ich nicht wollen, zu erfassen, aber die benannte Gruppe,(?<line>...)
immer funktioniert.Ich nicht VB, aber hier ist eine demo in C#.
Ich habe gerade überprüft, mit den zwei Beispielen von oben
'+{.+}$
tun sollte. Optional könnten Sie gehen mit('|'')+{.+}$
aber die erste Lösung ersetzt werden, die in der xml-Beschreibungen ).Edit: wenn du
('+{.+}$|^$\n)
es löscht) alle Kommentare und b) alle leeren Zeilen. Allerdings, wenn Sie einen Kommentar und eine End Sub/Funktion nach, es dauert es bis eine Linie, die führt zu einem compiler-Fehler.Bevor
Nach
Bearbeiten: Zum löschen aller leeren Zeilen Suchen, Ersetzen Sie die folgenden regex
^$\n
mit leeren.^[\s|\t]*$\n
? Ich bin irgendwie nicht in der Lage, um herauszufinden, was Los ist hier falsch.System.Text.RegularExpressions.Regex
Klasse, das ist, wo die regex nicht funktioniert. Es ist auch ein bisschen Probleme mit der Kommentar-ersetzen, wie wenn es die Zeile im source-code -b.RowFilter = "Name='Soham'"
dann, nachdem das makro ausgeführt seine zu, wie dieser -b.RowFilter = "Name="
.Löschen Sie die Kommentare erste mit dieser regex
'+\s*(\W|\w).+
'+ - ein oder mehr " für den Anfang jedes Kommentars.
\s* - wenn es Leerzeichen nach den Kommentar.
(\W|\w).+ - alles, was folgt, außer Zeilentrenner.
Entfernen Sie dann die leeren Zeilen Links mit dem regex Mr. Alan Moore zur Verfügung gestellt.