regex: Kommentarzeilen ersetzen anstatt entfernen

Gast #5088993
Lesenswert?

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 #5088999
Lesenswert?

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 #5089001
Lesenswert?

> 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 #5090330
Lesenswert?

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 #5090395
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren