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
Regex: Anzahl öffnende = Anzahl schließende Klammern
VizOne
myCSharp.de - Member

Avatar #avatar-1563.gif


Dabei seit:
Beiträge: 1551

Themenstarter:

Regex: Anzahl öffnende = Anzahl schließende Klammern

beantworten | zitieren | melden

Hallo Community!


Ich habe strings in folgendem Format:
a(c) + b(a + b + c) + d(a(b) + d(c))

Jetzt möchte ich diesen String jeweils auf oberster ebene beim +-Zeichen splitten. Das gewünschte Resultat wäre:
a(c), b(a + b + c), d(a(b) + d(c))

Die Teilstrings würde ich dann rekursive mit dem gleichen Splitmuster weiterbearbeiten.

Um die jeweils oberster Ebene zu erhalten müssen öffnende und schließende Klammern sich jeweils ergänzen. Wie formuliere ich das als Regular Expression?

Hab mir für die Überbrückungszeit eine "manuelle" Lösung geschrieben:


static List<string> SplitPlus( string input ) {
	// TODO reimplement as regex

	List<string> strings = new List<string>();

	int openBrackets = 0;
	int left = 0;
	int length = 0;

	foreach( char c in input ) {
		++length;

		switch( c ) {
			case '{':
				++openBrackets;
				break;
			case '}':
				--openBrackets;
				break;
			case '+':
				// only add substring if + appeared on top level
				if( openBrackets == 0 ) {
					// copy substring, omit '+'
					strings.Add( input.Substring( left, length - 1 ) );
					left += length;
					length = 0;
				}
				break;
		}
	}
	// add rest
	strings.Add( input.Substring( left ) );
	return strings;
}
Aber ich denke, dass da mit Regex was zu machen ist. Danke für eure Hilfe!

MfG VizOne
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 VizOne,

nö, RegEx sind gerade nicht in der Lage mit der Paarigkeit von Klammern umzugehen. Du bräuchtest mindestens einen Parser für kontextfreie Sprachen. Aber deine rekursive Vorgehensweise finde ich sehr sinnvoll.

herbivore
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

Klar lässt sich mit RegEx was machen...
Wenn sich das Problem auf das was du geschilderst hast konzentriert, behalte diese Lösung, sie ist besser(performanter und übersichtlicher). RegEx ist rel. langsam, dafür universeller. Deine Lösung ist für dieses Problem besser.
Das war nur mein Senf dazu. Wenn du nur mehr über RegEx wissen willst bemühe die Forumssuche, oder google danach(Java etc. ist in dem Fall fast equivalent).
Für den beschriebenen Fall ist deine Lösung defintiv gut genug.
private Nachricht | Beiträge des Benutzers
cdr
myCSharp.de - Member



Dabei seit:
Beiträge: 1008
Herkunft: Zürich

beantworten | zitieren | melden

Zitat
Original von ikaros
Klar lässt sich mit RegEx was machen...

Nein. Herbivore hat schon recht, dafür bräuchtest du zumindest einen Zähler (-> somit eine kontextfreie Sprache). Die Sprache ist also nicht regulär und lässt sich auch nicht auf regulären Ausdrücken abbilden (siehe Pumping Lemma)...

Ich würde auch bei deiner Lösung bleiben, oder sie in eine allgemeine (klassische) Stackmaschine ausbauen falls du die Ausdrücke gleich auswerten möchtest ...
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4649
Herkunft: Riegel am Kaiserstuhl

beantworten | zitieren | melden

Das mit einem Stack habe ich gerade für das Validieren von BBcode entwickelt (*zwinker* zu Herbivore), wo ich letztlich auch prüfen muss, ob die öffnenden Tags zu den schließenden passen.

Falls Interesse besteht, kann ich die Klasse gerne zur Verfügung stellen.
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de
private Nachricht | Beiträge des Benutzers
maxE
myCSharp.de - Member



Dabei seit:
Beiträge: 456
Herkunft: Sachsen

beantworten | zitieren | melden

Das geht eigentlich schon fast in Richtung Compilerbau (Lexikalischer Scanner, Parser).
Schau dir einfach mal an wie man einen Parser (lehrbuchmäßig) implementiert, dann sollte das recht einfach gehen.

Schau mal hier (speziell unter Modell-Compiler->ExpressionParser Beispiele):
http://vhb.fh-regensburg.de/co/
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
private Nachricht | Beiträge des Benutzers
VizOne
myCSharp.de - Member

Avatar #avatar-1563.gif


Dabei seit:
Beiträge: 1551

Themenstarter:

beantworten | zitieren | melden

Oha, eigentlich hätte ich selbst drauf kommen können, dass es mit ner RegEx nicht geht. Letztes Semester an der Uni noch kontextfreie Sprachen, Pumping Lemma etc gehabt. Peinlich, peinlich. Übrigens: ja, ich habe das Fach bestanden. Wie war das? Man lernt fürs Leben?

Danke auf jeden Fall für eure Bemühungen. Ich lasse es so, wie es ist.

MfG VizOne
private Nachricht | Beiträge des Benutzers
Fabian
myCSharp.de - Member

Avatar #avatar-1590.jpg


Dabei seit:
Beiträge: 1994
Herkunft: Dortmund

beantworten | zitieren | melden

Zitat
Original von Der Eisbär
Das mit einem Stack habe ich gerade für das Validieren von BBcode entwickelt (*zwinker* zu Herbivore), wo ich letztlich auch prüfen muss, ob die öffnenden Tags zu den schließenden passen.

Falls Interesse besteht, kann ich die Klasse gerne zur Verfügung stellen.

Hallo Der Eisbar,

ich lese Deinen Beitrag ja jetzt erst . Ich bin an der Klasse interessiert. Ist das nicht evtl. auch was für die Komponentensammlung?
Das Parsen kann ja wahrscheinlich einfach erweitert werden oder nicht und dann haben mit Sicherheit noch andere Leute interesse daran.


Gruß,
Fabian
"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de
private Nachricht | Beiträge des Benutzers