<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[parsing bracket pairs]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgendes Problem: für einen Ausdruck, der aus Klammern ( ) und anderen Zeichen besteht, soll zu einer gegebenen öffnenden Klammer &quot;(&quot; die *zugehörige* schließende Klammer &quot;)&quot; gefunden werden.</p>
<p>Beispiel: Zur Eingabe (abc(de)(f)) soll der Inhalt des äußersten Klammerpaares, also abc(de)(f) ausgegeben werden.</p>
<p>Problem: Mit puren regulären Ausdrücken scheint das nicht zu gehen. Schließlich ist die Sprache aller wohlgeformten Klammerausdrücke nicht regulär, sondern kontextfrei. Gibt es in einer der in Frage kommenden Sprachen awk/sed/bash/python/ruby (notfalls auch C/C++) eine elegante Methode oder gar eingebaute Funktion zum Erkennen zusammengehöriger Klammern ? Oder zum automatischen Extrahieren des Klammerinhalts, selbst wenn weitere Klammerebenen dazwischenliegen, wie im Beispiel ?</p>
<p>[Natürlich läßt sich das Problem in jeder Sprache mittels eines Zählers lösen, der bei &quot;(&quot; eins hochzählt und bei &quot;)&quot; eins herunterzählt; bei Erreichen der Null ist die Klammer gefunden. Aber ich frage mich, ob es nicht noch eine einfachere Möglichkeit gibt, die mit &quot;Bordmitteln&quot; auskommt, ohne den beschriebenen Zählmechanismus implementieren zu müssen]</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/157468/parsing-bracket-pairs</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Jul 2026 12:24:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157468.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 Aug 2006 05:27:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to parsing bracket pairs on Sat, 26 Aug 2006 05:27:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgendes Problem: für einen Ausdruck, der aus Klammern ( ) und anderen Zeichen besteht, soll zu einer gegebenen öffnenden Klammer &quot;(&quot; die *zugehörige* schließende Klammer &quot;)&quot; gefunden werden.</p>
<p>Beispiel: Zur Eingabe (abc(de)(f)) soll der Inhalt des äußersten Klammerpaares, also abc(de)(f) ausgegeben werden.</p>
<p>Problem: Mit puren regulären Ausdrücken scheint das nicht zu gehen. Schließlich ist die Sprache aller wohlgeformten Klammerausdrücke nicht regulär, sondern kontextfrei. Gibt es in einer der in Frage kommenden Sprachen awk/sed/bash/python/ruby (notfalls auch C/C++) eine elegante Methode oder gar eingebaute Funktion zum Erkennen zusammengehöriger Klammern ? Oder zum automatischen Extrahieren des Klammerinhalts, selbst wenn weitere Klammerebenen dazwischenliegen, wie im Beispiel ?</p>
<p>[Natürlich läßt sich das Problem in jeder Sprache mittels eines Zählers lösen, der bei &quot;(&quot; eins hochzählt und bei &quot;)&quot; eins herunterzählt; bei Erreichen der Null ist die Klammer gefunden. Aber ich frage mich, ob es nicht noch eine einfachere Möglichkeit gibt, die mit &quot;Bordmitteln&quot; auskommt, ohne den beschriebenen Zählmechanismus implementieren zu müssen]</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124784</guid><dc:creator><![CDATA[Hobbyprogrammierer]]></dc:creator><pubDate>Sat, 26 Aug 2006 05:27:18 GMT</pubDate></item><item><title><![CDATA[Reply to parsing bracket pairs on Sun, 27 Aug 2006 01:25:07 GMT]]></title><description><![CDATA[<p>dein &quot;zählmechanismus&quot; besteht aus 4 zeilen code, maximal, und die hättest du 10 mal tippen können in der zeit in der du den beitrag da geschrieben hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125201</guid><dc:creator><![CDATA[loleh]]></dc:creator><pubDate>Sun, 27 Aug 2006 01:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to parsing bracket pairs on Sun, 27 Aug 2006 08:10:17 GMT]]></title><description><![CDATA[<p><a href="http://www.lrz-muenchen.de/services/schulung/unterlagen/regul/regul-11.html#paren" rel="nofollow">http://www.lrz-muenchen.de/services/schulung/unterlagen/regul/regul-11.html#paren</a></p>
<pre><code>[(][^()]*[)]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1125224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125224</guid><dc:creator><![CDATA[Gerard]]></dc:creator><pubDate>Sun, 27 Aug 2006 08:10:17 GMT</pubDate></item><item><title><![CDATA[Reply to parsing bracket pairs on Sun, 27 Aug 2006 09:47:49 GMT]]></title><description><![CDATA[<p>Gerard, das erlaubt aber keine Verschachtelung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125247</guid><dc:creator><![CDATA[SG1]]></dc:creator><pubDate>Sun, 27 Aug 2006 09:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to parsing bracket pairs on Sun, 27 Aug 2006 10:43:57 GMT]]></title><description><![CDATA[<p>Bei Perl un Php gehts mit recuriven Regexen. Boost::regex hat diese Erweiterung aber leider (noch) nicht übernommen.</p>
<p>Ich glaub das geht so:</p>
<pre><code>[(](?R)*[)]
</code></pre>
<p>Wobei (?R) durch das gesamte Regex ersetzt wird. Dies wird dann recursive fortgesetzt.</p>
<p>Ohne Recurion geht das aber nicht mit Regexen.</p>
<p>Jemand der geübt in Boost.Spirit ist könnte da wahrscheinlich was hinzaubern. Wobei da dann doch der selbst geschriebene Parsers doch einfacher ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125272</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sun, 27 Aug 2006 10:43:57 GMT</pubDate></item><item><title><![CDATA[Reply to parsing bracket pairs on Sun, 27 Aug 2006 10:44:40 GMT]]></title><description><![CDATA[<p>ok &quot;[(][^()]<em>[)]&quot; matcht nur (de) und (f)<br />
aber<br />
[(]([^()]</em>|.*)[)] matcht auf abc(de)(f)</p>
<p><a href="http://regexp-evaluator.de/evaluator/" rel="nofollow">http://regexp-evaluator.de/evaluator/</a></p>
<p>hat natürlich noch andere probleme, an die man sich rantasten muss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125273</guid><dc:creator><![CDATA[Gerard]]></dc:creator><pubDate>Sun, 27 Aug 2006 10:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to parsing bracket pairs on Sun, 27 Aug 2006 12:38:04 GMT]]></title><description><![CDATA[<blockquote>
<p>ok &quot;[(][^()]<em>[)]&quot; matcht nur (de) und (f)<br />
aber<br />
[(]([^()]</em>|.*)[)] matcht auf abc(de)(f)</p>
</blockquote>
<p>Bringt dir aber leider nichts, da die Gruppierungen nicht entsprechend fortgesetzt werden. Bei (abc(de)(f)) wird lediglich abc(de)(f) als Gruppierung geliefert.</p>
<p>Es ist schlichtweg nicht möglich eine nicht-reguläre Sprache (wie C++, Java, ...) mit regulären Ausdrücken zu parsen. Rekursionen erweitern reguläre Ausdrücke dahingehend, dass man sie eigentlich gar nicht mehr als reguläre Ausdrücke bezeichnen kann, siehe auch <a href="http://en.wikipedia.org/wiki/Regular_expression#Patterns_for_irregular_languages" rel="nofollow">Wikipedia</a>.</p>
<p>Einzige Alternative die, dir bleibt ist eine Art Scanner Generator zu verwenden. Da ich selbst aus dem Java Umfeld komme, kenne ich auch nur Projekte wie jflex oder JavaCC, die in diese Richtung gehen, aber vielleicht findest ja selbst was.</p>
<p>Im Prinzip bleibts aber bei der Idee der Rekursion, es wird halt lediglich das Suchmuster &quot;zerlegt&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125332</guid><dc:creator><![CDATA[foobar&#96;?&#96;]]></dc:creator><pubDate>Sun, 27 Aug 2006 12:38:04 GMT</pubDate></item></channel></rss>