2 Stimmen

Vereinfachung regulärer Ausdrücke - zu viele Gruppen

Ich schreibe einen einfachen Textgrabber für den C-Style Präprozessor. Der Eingabetext (Beispiel):

#if 1 > 0
blah
#if defined MACRO1
blah blah blah
#if !defined MACRO2
blaaaah
#if      !   defined MACRO3
blah?

Ich möchte den Text erfassen, der nach jedem #if [!] defined Erklärung. Die Ausgabe, die ich aus dem obigen Text benötigen würde, ist:

MACRO1
MACRO2
MACRO3

Die hier zu erfassenden Zeilennummern sind 3, 5 und 7. Beachten Sie, dass in Zeile 7 Leerzeichen mit Tabulatoren vermischt sind.

Ich habe versucht, Ausdrücke zu erstellen, die mir dieses Ergebnis liefern können, aber keiner war so brillant. Mein Ausdruck, der das gewünschte Ergebnis liefert, ist

(?<=(?<=(?<=(?<=(?<=(?<=#if)[\s\t]+)!?)[\s\t]*)defined)[\s\t]+).*

Verwendete Optionen sind: Mehrzeilig + IgnorierenGroßschreibung

Aber ich bin sicher, dass dies nicht elegant und prägnant ist. Kann jemand bitte einen besseren Ausdruck vorschlagen?

PS - Ich verwende Expresso um den Ausdruck zu testen.

1voto

Wessel Kranenborg Punkte 1380

Was ist mit dieser Regex?

#if[\s\t]+[!]?[\s\t]*defined[\s\t]*(.*)

In Rückverweis eins erhalten Sie die MACRO1/MACRO2/MACRO3.

1voto

James Kyburz Punkte 12661

Dies sollte funktionieren Vorausgesetzt, s enthält die Eingabe in Ihrer Frage mit Zeilenumbrüchen usw.

foreach(var match in Regex.Matches(s, @"(?<=#if\s*!?\s*defined\s*)(?<macro_name>\w+)")) {
  Console.WriteLine(match);
}

Findet MACRO01, MACRO02 und MACRO03 als 3 Captures

0voto

Marcello Faga Punkte 1044

Ay Nayan

Ich habe verstanden, dass Sie die Makro-Referenznamen aller "#if defined"- und "#if !defined"-Präprozessoranweisungen erhalten müssen, die sich innerhalb eines allgemeinen C-Quelltextstroms befinden...

Ich kann Ihnen diese einfache Regex vorschlagen

^#if\s*!?\s*defined\s*(\w*).*$

die vorherige Regex hat nur eine einzige erfassende Gruppe definiert ( \w *), um nur den Makronamen zu erhalten.

wird die Erfassungsgruppe mit allen vorkommenden Makronamen gefüllt.

*PS: Der Regex muss mit den Optionen Mehrzeilig + Groß-/Kleinschreibung ignorieren ausgeführt werden. Ich habe das mit dem RegExr-Tool getestet http://gskinner.com/blog/archives/2008/03/regexr_free_onl.html *

0voto

sawa Punkte 160498

Funktioniert das?

^#if(?:[ \t]*!)?[ \t]*defined[ \t]*(.*?)$

ohne mehrzeilige Option?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X