<?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[Boost - RegExs, kein dynamischer Replacement-String]]></title><description><![CDATA[<p>In Perl habe ich diese Funktion:</p>
<pre><code>sub parse_content()
{
        my $content     =$_[0];
        my $hash_ref    =$_[1];
        $$content=~s#\$\$(.+?)\$\$#$hash_ref-&gt;{$1}#sg;
}
</code></pre>
<p>Die Funktion geht an sich jedes $$blabla$$ durch und erstetzt es durch den Wert, welcher durch die Nutzung des Schlüssels $1 in der Hash-Ref rauskommt - zum automatischen Befüllen von Formularen eben.</p>
<p>Das gleiche wollte ich für C++ in Verbindung mit Boost machen (was Boost angeht, bin ich noch Neuling, aber ich habe es geschafft, auf Linux zu installieren, ohne dass die Kiste brennt). Problem ist aber, dass <code>regex_replace</code> irgendwie davon ausgeht, dass ich einen genauen Plan davon habe, was ich in $$blabla$$ setzen will. Oben sag ich ja: &quot;Och, such mal nach allem und verwende das als Key&quot;, mit Boost kann ich aber nur angeben: &quot;Och, such mal nach allem und verwende immer DIESEN Key&quot;:</p>
<pre><code class="language-cpp">void parse_content(std::string&amp; s,boost::unordered_map&amp;m)
{
        boost::regex pat=&quot;\\$\\$(.+?)\\$\\$&quot;;
        boost::regex_replace(s,pat,m[&quot;\\1&quot;]);//Hier das Problem, in allen Beispielen kann ich nur die Platzhalter oder einen festen String angeben, aber niemals MIT dem Platzhalter auf einen Wert zugreifem.
}
</code></pre>
<p>Ich könnte mir ein Konstrukt überlegen, in dem ich den String erst nach allen $$blabla$$ durchsuche und mir dann anhand der Reihenfolge merke, welche Strings wodurch zu ersetzen sind, denn an die unsortierten Werte scheine ich so oder so nicht ohne Vorwissen dranzukommen - oder?<br />
Würde jetzt ungern loslegen und dann später gesagt bekommen, dass es einen ganz einfachen Kniff gibt, den ich nur mit stundenlangem Google-Suchen nicht finden konnte ...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309846/boost-regexs-kein-dynamischer-replacement-string</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 01:52:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309846.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Oct 2012 04:19:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost - RegExs, kein dynamischer Replacement-String on Mon, 29 Oct 2012 04:19:08 GMT]]></title><description><![CDATA[<p>In Perl habe ich diese Funktion:</p>
<pre><code>sub parse_content()
{
        my $content     =$_[0];
        my $hash_ref    =$_[1];
        $$content=~s#\$\$(.+?)\$\$#$hash_ref-&gt;{$1}#sg;
}
</code></pre>
<p>Die Funktion geht an sich jedes $$blabla$$ durch und erstetzt es durch den Wert, welcher durch die Nutzung des Schlüssels $1 in der Hash-Ref rauskommt - zum automatischen Befüllen von Formularen eben.</p>
<p>Das gleiche wollte ich für C++ in Verbindung mit Boost machen (was Boost angeht, bin ich noch Neuling, aber ich habe es geschafft, auf Linux zu installieren, ohne dass die Kiste brennt). Problem ist aber, dass <code>regex_replace</code> irgendwie davon ausgeht, dass ich einen genauen Plan davon habe, was ich in $$blabla$$ setzen will. Oben sag ich ja: &quot;Och, such mal nach allem und verwende das als Key&quot;, mit Boost kann ich aber nur angeben: &quot;Och, such mal nach allem und verwende immer DIESEN Key&quot;:</p>
<pre><code class="language-cpp">void parse_content(std::string&amp; s,boost::unordered_map&amp;m)
{
        boost::regex pat=&quot;\\$\\$(.+?)\\$\\$&quot;;
        boost::regex_replace(s,pat,m[&quot;\\1&quot;]);//Hier das Problem, in allen Beispielen kann ich nur die Platzhalter oder einen festen String angeben, aber niemals MIT dem Platzhalter auf einen Wert zugreifem.
}
</code></pre>
<p>Ich könnte mir ein Konstrukt überlegen, in dem ich den String erst nach allen $$blabla$$ durchsuche und mir dann anhand der Reihenfolge merke, welche Strings wodurch zu ersetzen sind, denn an die unsortierten Werte scheine ich so oder so nicht ohne Vorwissen dranzukommen - oder?<br />
Würde jetzt ungern loslegen und dann später gesagt bekommen, dass es einen ganz einfachen Kniff gibt, den ich nur mit stundenlangem Google-Suchen nicht finden konnte ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265177</guid><dc:creator><![CDATA[Der aus dem Westen ..]]></dc:creator><pubDate>Mon, 29 Oct 2012 04:19:08 GMT</pubDate></item><item><title><![CDATA[Reply to Boost - RegExs, kein dynamischer Replacement-String on Mon, 29 Oct 2012 21:17:00 GMT]]></title><description><![CDATA[<p>Der aus dem Westen .. schrieb:</p>
<blockquote>
<p>(was Boost angeht, bin ich noch Neuling, aber ich habe es geschafft, auf Linux zu installieren, ohne dass die Kiste brennt).</p>
</blockquote>
<p>Die neueren boost Versionen haben einen verzögerten Selbstzerstörungsmechanismus, dein Prozessor wird übertaktet und durchbrennen, wenn du es am wenigsten erwartest.</p>
<p>Ich hab boost::regexp noch nie benutzt, aber das geht bestimmt. Musst halt nach umfangreicheren Beispielen suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265426</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Mon, 29 Oct 2012 21:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to Boost - RegExs, kein dynamischer Replacement-String on Tue, 30 Oct 2012 01:04:44 GMT]]></title><description><![CDATA[<p>boost::regex_replace frisst einen Format-Funktor, in dem man einen match auf alles mögliche adaptern kann. Mal ganz simpel gestrickt:</p>
<pre><code class="language-cpp">#include &lt;boost/regex.hpp&gt;
#include &lt;boost/ref.hpp&gt;
#include &lt;boost/unordered_map.hpp&gt;

#include &lt;iostream&gt;
#include &lt;string&gt;

typedef boost::unordered_map&lt;std::string, std::string&gt; token_map;

class token_adapter {
public:
  token_adapter(token_map const &amp;map) : map_(map) { }

  std::string operator()(boost::smatch const &amp;what) const {
    token_map::const_iterator i = map_.get().find(what.str(1));

    if(i == map_.get().end()) {
      return &quot;(null)&quot;;
    }

    return i-&gt;second;
  }

private:
  boost::reference_wrapper&lt;token_map const&gt; map_;
};

std::string process_content(std::string const &amp;s, token_map const &amp;m)
{
  boost::regex pat(&quot;\\$\\$([^\\$]*)\\$\\$&quot;);
  return boost::regex_replace(s, pat, token_adapter(m));
}

int main() {
  token_map m;
  std::string s = &quot;lala $$foo$$ xxx foo $$quux$$ $$bla$$ yz&quot;;

  m[&quot;foo&quot;] = &quot;bar&quot;;
  m[&quot;quux&quot;] = &quot;xyzzy&quot;;

  std::cout &lt;&lt; process_content(s, m) &lt;&lt; '\n';
}
</code></pre>
<p>Das sieht mit Lambdas natürlich hübscher aus, aber ich weiß nicht, ob du dich schon auf C++11 stützen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265455</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 30 Oct 2012 01:04:44 GMT</pubDate></item></channel></rss>