- Offizieller Beitrag
r1fLeX hatte sich ja schonmal daran versucht. Da war aber das RegExp-Pattern nicht ausreichend.
Ich habe das jetzt mal erweitert auf (hoffentlich) alle Kommentar-Möglichkeiten:
Das Script:
[autoit]
$sFilename = FileOpenDialog('Bitte Datei auswählen...', @ScriptDir, 'AutoIt-Source (*.au3)')
If Not @error Then
$sFile = FileRead($sFilename) ; Sourcecode einlesen
$sNew = StringRegExpReplace($sFile, '((\x22|\x27).*(\x22|\x27))|(;.*)|(#cs|#comments-start)(.*\r\n)(.*\r\n)*(#ce|#comments-end)(.*\r\n)', '\1') ; Kommentare entfernen
$sNew = StringRegExpReplace($sNew, '([^\r])\n', '\1' & @CRLF) ; weil einige CRLF durch das Pattern zu LF wurden, das Zeilenende wieder korrigieren
$sNew = StringRegExpReplace($sNew, '(\r\n)+', '\1') ; doppelte Zeilenenden in einfache umwandeln
$sFilename = StringReplace($sFilename, '.au3', '_StripComment.au3') ; Dateinamen für die neue Datei anpassen
$hFile = FileOpen($sFilename, 2) ; neue Datei zum speichern öffnen
FileWrite($hFile, $sNew) ; Daten schreiben
FileClose($hFile) ; Datei schließen
EndIf
Beispieldatei vor dem bearbeiten:
Spoiler anzeigen
For $i = 0 To 100 Step 10 ;Der Kommentar soll weg
For $j = 0 To 10
;~ GUICtrlCreateLabel('', 16 + $i * 3.8, 180, 20, 16)
GUICtrlCreateLabel('', 16 + $i * 3.8, 180, 20, 16)
Next
Next
; Test mit "
Global $test = "ein Semikolon ; innerhalb von Anführungsstrichen darf nicht entfernt werden" ; das hier hinten schon
; Test mit '
Global $test = 'ein Semikolon ; innerhalb von Anführungsstrichen darf nicht entfernt werden' ; das hier hinten schon
#cs
Das hier ist nur ein zusätzlicher Kommentar
zum testen, ob auch cs...ce entfernt wird
blablabla
#ce
#comments-start
cs und ce gibt es ja auch noch ausgeschrieben
#comments-end
While True;das ist ein Kommentar ohne Leerzeichen vor und nach dem Semikolon
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $hClose
Exit
EndSwitch
WEnd;und das auch
Beispieldatei nach dem bearbeiten:
Spoiler anzeigen
For $i = 0 To 100 Step 10
For $j = 0 To 10
GUICtrlCreateLabel('', 16 + $i * 3.8, 180, 20, 16)
Next
Next
Global $test = "ein Semikolon ; innerhalb von Anführungsstrichen darf nicht entfernt werden"
Global $test = 'ein Semikolon ; innerhalb von Anführungsstrichen darf nicht entfernt werden'
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $hClose
Exit
EndSwitch
WEnd
Gibt es da noch irgendeinen Fall, den ich übersehen habe?
@Xeno: Das RegExpReplace kannst Du vor der Erkennung einsetzen, dann sind die Kommentare weg und es werden nur die "richtigen" Befehle erkannt.