Laden...

[Gelöst] Regex - Verbot von einer Zeichenkombination

Erstellt von Cuin vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.512 Views
C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren
[Gelöst] Regex - Verbot von einer Zeichenkombination

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

49.485 Beiträge seit 2005
vor 13 Jahren

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

795 Beiträge seit 2006
vor 13 Jahren

Also mit dem gelieferten Beispieltext funktioniert dein Pattern einwandfrei...

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
1.002 Beiträge seit 2007
vor 13 Jahren

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

49.485 Beiträge seit 2005
vor 13 Jahren

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

C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren

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