Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[Gelöst] Regex - Verbot von einer Zeichenkombination
Cuin
myCSharp.de - Member



Dabei seit:
Beiträge: 92

Themenstarter:

[Gelöst] Regex - Verbot von einer Zeichenkombination

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Cuin am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 832
Herkunft: /dev/null

beantworten | zitieren | melden

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"
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo TheBrainiac,
Zitat
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
private Nachricht | Beiträge des Benutzers
Cuin
myCSharp.de - Member



Dabei seit:
Beiträge: 92

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für eure Hilfe, ich habs jetzt geschafft alle möglichen Kommentare richtig auszulesen und zuzuordnen.
Zitat
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;
Zitat
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
private Nachricht | Beiträge des Benutzers