Forum: PC-Programmierung regex: Kommentarzeilen ersetzen anstatt entfernen


von Michael_Jo (Gast)


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

von Guten Morgen (Gast)


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.

von Komandozeile vor dem Frühstück für Alle! (Gast)


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?

von J. F. (Firma: Père Lachaise) (rect)


Lesenswert?

Wie sieht denn dein Ansatz bis jetzt aus?

von ui (Gast)


Lesenswert?

Komandozeile vor dem Frühstück für Alle! schrieb:
> /* AUS
>  int a;
>  a = f(p, 32);
> */
>
> /* EIN */
>  int a;
>  a = f(p, 32);
> /* */
>
> Reicht das, als Idee zum Ansatz?

Das ist ja semantisch etwas komplett anderes, nu so als hinweis.

von A. S. (Gast)


Lesenswert?

Komandozeile vor dem Frühstück für Alle! schrieb:
> Reicht das, als Idee zum Ansatz?

Mich würde das eher verwirren.

War das als Scherz gedacht? Oder Ironie?

Oder hast Du Dich einfach vertan?

von A. S. (Gast)


Lesenswert?

Wenn Du Jetzt alles löschst, dann ersetze künftig Gruppen aus ( 
beliebigen Zeichen ohne Zeilenumbruch) + Zeilenumbruch durch einen 
Zeilenumbruch.

von nicht"Gast" (Gast)


Lesenswert?

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

von nicht"Gast" (Gast)


Lesenswert?

Damig

nur C - ähnlich. Was ist es denn für eine Programmiersprache? Oder ist 
das ein Geheimnis?

von Komandozeile vor dem Frühstück für Alle! (Gast)


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?

von J. F. (Firma: Père Lachaise) (rect)


Lesenswert?

Ich werfe noch ein das sich je nach System die line endings 
unterscheiden und so dein Regex nicht unbedingt portabel ist. Oder gibt 
es dafür eine Lösung?

von Carl D. (jcw2)


Lesenswert?

So macht das übrigens der C-Preprocesser, wenn er dem Parser sagen will, 
wo man sich gerade befindet:
http://en.cppreference.com/w/cpp/preprocessor/line

von Michael_Jo (Gast)


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

von Michael_Jo (Gast)


Lesenswert?

>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#

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.