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
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.
> 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?
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.
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?
Wenn Du Jetzt alles löschst, dann ersetze künftig Gruppen aus ( beliebigen Zeichen ohne Zeilenumbruch) + Zeilenumbruch durch einen Zeilenumbruch.
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
Damig nur C - ähnlich. Was ist es denn für eine Programmiersprache? Oder ist das ein Geheimnis?
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?
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?
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
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.