regex: Kommentarzeilen ersetzen anstatt entfernen

Gast #5088993
Hallo,
ich möchte einen C ähnlichen Quelltext parsen und entferne dazu vorher 
die Kommentare. /**/ als auch //

Das klappt gut, zB damit:
https://stackoverflow.com/questions/3524317/regex-to-strip-line-comments-from-c-sharp/9119583#9119583

Bei Mehrzeiligen Kommentaren werden aber auch die Zeilen entfernt, was 
dazu führt, dass der nachgeschaltete Parser sagt: "Fehler in Zeile 100". 
Im Orginal war es aber in Zeile 120.

Ich möchte also die /* */ Kommentare nicht ganz entfernen, sondern 
mindestens die Zeilenumbrüche behalten. Ggf. auch einfach mit 
Whitespaces füllen.

Hat jemand eine Idee für einen Ansatz?

Michael
Gast
Hi,

wenn du verstehst was regex macht ist das ganz einfach
Du kannst statt dem replace erst mal ein Match machen.
Dann jedes match anschauen und die Zeilenumbrüche zählen.
dann statt einem replace deinen Code über eine schleife aller matches 
wieder zusammenbauen und dann die Leerzeilen entsprechen wieder 
einfügen.
Gast
> Ich möchte also die /* */ Kommentare nicht ganz entfernen, sondern
> mindestens die Zeilenumbrüche behalten. Ggf. auch einfach mit
> Whitespaces füllen.
>
> Hat jemand eine Idee für einen Ansatz?
1
/* AUS
2
 int a;
3
 a = f(p, 32);
4
*/
5

6
/* EIN */
7
 int a;
8
 a = f(p, 32);
9
/* */

Reicht das, als Idee zum Ansatz?
Gast
Für so was gibts eigentlich den Präprozessor

1
#ifdef EIN
2
   int a;
3
   a = f(p, 32);
4
#endif

und dann dem Compiler das entsprechende Flag (-DEIN) zum Kompilieren 
mitgeben.


Grüße
Gast
Achim S. schrieb:
> Komandozeile vor dem Frühstück für Alle! schrieb:
>> Reicht das, als Idee zum Ansatz?
> Oder hast Du Dich einfach vertan?


Meine Idee zum Ansatz sollte anregen die Sache in 2 Durchgänge zu 
erledigen: 1. Start- & Stop-Marker setzen 2. dazwischen ausräumen.
/ Think:  BEGIN ... END /

Wie heisst es hier im Forum immer: Hilfe zur Selbsthilfe bieten, nicht 
den Anderen zu Schulaufgaben Fertiglösungen präsentieren?
Gast
Ich hab wie schon geschrieben einen Vorschlag von stackoverflow benutzt:

static string StripComments(string code)
{
    var re = 
@"(@(?:""[^""]*"")+|""(?:[^""\n\\]+|\\.)*""|'(?:[^'\n\\]+|\\.)*')|//.*|/ 
\*(?s:.*?)\*/";
    return Regex.Replace(code, re, "$1");
}

Der reguläre Ausdruck ist kompliziert, aber er funktioniert. Nur werden 
eben die Zeilenumbrüche auch entfernt.

Das so umbauen, dass die Zeilenumbrüche erhalten bleiben stell ich mir 
sehr schwer vor. Soweit bin ich nicht bewandert mit regulären 
Ausdrücken.

Ich dachte eher, dass jemand sowas schon mal selbst in seinem Projekt 
gemacht hat und es teilen möchte.

Michael
Gast
>nur C - ähnlich. Was ist es denn für eine Programmiersprache? Oder ist
>das ein Geheimnis?
Ist eher eine Beschreibungsdatei, die ich einlesen möchte. Kommentare 
sind aber wie in C, C++, C#

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.