Hallo,
ich habe ein Problem beim Filtern von C-Kommentaren aus einer ASCII-Datei (txt-Datei).
Und zwar kommen in dieser Datei mehrere derartige Kommentare vor:
Irgendeinausdruck; /* Ein Kommentar */
Einzweiterausdruck; /* Zweiter Kommentar */
Ich möchte jetzt den ersten Kommentar rausfiltern, dazu habe ich folgendes Regex-Pattern geschrieben:
(?<name>Irgendeinausdruck)[^;]*;[^\n]*/\*(?<Comment>[^(/\*)]*)\*/
Mein Problem befindet sich in diesem Ausschnitt des Pattern:
/\*(?<Comment>[^(/\*)]*)\*/
Ich möchte also den Text filtern, der zwischen /* und / steht.
Leider liefert mir mein Regex-Ausdruck dann alles was zwischen dem Anfang des ersten Kommentars und dem Ende des zweiten Kommentars steht.
Ich möchte also dieses "gierige Verhalten" ausschalten, indem ich angebe, dass die Zeichenkombination "/" nich vorkommen darf.
Leider kann ich aber mit [^...] nur einzelne Zeichen verbieten, nicht aber eine Zeichenkombination. Hat jemand eine Ahnung wie ich das lösen kann? Ein ?-Zeichen einfach nach
(?<Comment>[^(/\*)]*)
zu setzen liefert leider überhaupt kein Ergebnis.
mfg Cuin
Hallo Cuin,
siehe RegEx kürzester Match [und die Gefahren von .*?]
Wobei die Zeichenkombination /*
durchaus vorkommen darf. /* /* */
ist ein legaler C#-Kommentar. Was du verbieten musst, ist dass die Zeichenkombination \*/
vorkommt. 😃
herbivore
Also mit dem gelieferten Beispieltext funktioniert dein Pattern einwandfrei...
Hallo Cuin,
versucht es mal mit diesem regulären Ausdruck:
/\*(?<comment>.*?)\*/
Wenn ich dein Anliegen richtig verstanden habe, sollte er korrekt funktionieren. Für den ersten Kommentar matcht die Gruppe comment "Ein Kommentar".
m0rius
P.S: Getestet habe ich den regulären Ausdruck mit dem On-the-fly Regex-Tester: Regex-Lab von herbivore.
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo TheBrainiac,
Also mit dem gelieferten Beispieltext funktioniert dein Pattern einwandfrei...
in dem Beispiel schon, aber (?<Comment>[^(/\*)]*)
tut im allgemeinen sicher nicht das gewünschte. Die möglichen Lösungen stehe in dem Link, den ich ganz zu Anfang gepostet habe.
herbivore
Vielen Dank für eure Hilfe, ich habs jetzt geschafft alle möglichen Kommentare richtig auszulesen und zuzuordnen.
Wobei die Zeichenkombination /* durchaus vorkommen darf. /* /* */ ist ein legaler C#-Kommentar. Was du verbieten musst, ist dass die Zeichenkombination */ vorkommt. 😃
Stimmt, daran hab ich garnicht gedacht 😃
@m0rius: Den Ausdruck
/\*(?<comment>.*?)\*/
hatte ich schon ausprobiert gehabt, leider hat er bei mehreren hintereinanderliegenden mehrzeiligen Kommentaren Probleme verursacht (Auch bei der RegexOption "Singleline"). Z.B.:
/* Dies
ist ein mehrzeiliger Kommentar */
/* Dieser hier
auch */
irgendeinausdruck;
P.S: Getestet habe ich den regulären Ausdruck mit dem On-the-fly Regex-Tester: Regex-Lab von herbivore.
Den benutze ich auch 😃 Der ist echt super!
Gelöst habe ich das ganze mit Hilfe des Links den herbivore angegeben hat (RegexOption "Singleline" aktivieren):
/\*(?<Comment>((?!\*/).)*)\*/
Vielen Dank für eure Hilfe!
mfg Cuin