<?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[Mehrfache Ersetung in strings]]></title><description><![CDATA[<p>Ich suche nach einem brauchbaren Algorithmus für mehrfache übersetzungen in einem String - d.h. ich habe z.B. eine map&lt;string,string&gt; mit Schlüsselwärtern und Ersetzungen.</p>
<p>Beispiel:</p>
<p>map[&quot;FOO&quot;] = &quot;Fehler-Objektorientiert)&quot;;<br />
map[&quot;BAR&quot;] = &quot;Cash&quot;;</p>
<p>string s = &quot;Hans FOOBAR&quot;;</p>
<p>multireplace(s, map);<br />
assert(s == &quot;Hans Fehler-ObjektorientiertCash&quot;);</p>
<p>die map kann evtl. recht lang werden, so daß ich nicht grad an jedem Zeichen auf alle strings prüfen möchte.</p>
<p>Randbedingungen:</p>
<ul>
<li>Bei zwei Schlüsseln &quot;FOO&quot; und &quot;FOOS&quot; soll der länger erkannt werden (falls er paßt)</li>
<li>Schlüsselvergleich optional ohne Beachtung Groß/Kleinschreibung</li>
</ul>
<p>Ideen oder Links?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172921/mehrfache-ersetung-in-strings</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 05:04:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172921.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Feb 2007 16:35:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mehrfache Ersetung in strings on Fri, 09 Feb 2007 16:35:34 GMT]]></title><description><![CDATA[<p>Ich suche nach einem brauchbaren Algorithmus für mehrfache übersetzungen in einem String - d.h. ich habe z.B. eine map&lt;string,string&gt; mit Schlüsselwärtern und Ersetzungen.</p>
<p>Beispiel:</p>
<p>map[&quot;FOO&quot;] = &quot;Fehler-Objektorientiert)&quot;;<br />
map[&quot;BAR&quot;] = &quot;Cash&quot;;</p>
<p>string s = &quot;Hans FOOBAR&quot;;</p>
<p>multireplace(s, map);<br />
assert(s == &quot;Hans Fehler-ObjektorientiertCash&quot;);</p>
<p>die map kann evtl. recht lang werden, so daß ich nicht grad an jedem Zeichen auf alle strings prüfen möchte.</p>
<p>Randbedingungen:</p>
<ul>
<li>Bei zwei Schlüsseln &quot;FOO&quot; und &quot;FOOS&quot; soll der länger erkannt werden (falls er paßt)</li>
<li>Schlüsselvergleich optional ohne Beachtung Groß/Kleinschreibung</li>
</ul>
<p>Ideen oder Links?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225790</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Fri, 09 Feb 2007 16:35:34 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfache Ersetung in strings on Fri, 09 Feb 2007 18:28:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for(map&lt;string, string&gt;::iterator iter = myMap.begin(); iter != myMap.end(); ++iter)
{
    string::size_type pos;
    while((pos = s.find(iter-&gt;first)) &amp;&amp; pos != string::npos)
        s.replace(pos, iter-&gt;first.size(), iter-&gt;second);
}
</code></pre>
<p>[Edit] Zu den Randbedingungen:</p>
<ol>
<li>Kannst du die Map nach der Schlüssellänge sortieren?</li>
<li>Das ist eklig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Kann ich dir nicht sagen, welches der beste Weg ist.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1225832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225832</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 09 Feb 2007 18:28:56 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfache Ersetung in strings on Fri, 09 Feb 2007 21:57:23 GMT]]></title><description><![CDATA[<p>Eine klitzekleine Optimierung:</p>
<pre><code class="language-cpp">for(map&lt;string, string&gt;::iterator iter = myMap.begin(); iter != myMap.end(); ++iter)
{
    string::size_type pos = s.find(iter-&gt;first);
    while(pos != string::npos)
    {
        s.replace(pos, iter-&gt;first.size(), iter-&gt;second);
        pos = s.find(iter-&gt;first, pos + iter-&gt;first.size ());
    }
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4165">@peterchen</a>: Wofür brauchst du das?! So wie du das schilderst scheint es mir ziemlich aufwendig zu programmieren, ist es das wert?</p>
<p>/edit: Zu 1.: Wenn du die Map an sich nicht umsortieren kannst/willst, ist vielleicht <a href="http://www.boost.org/libs/multi_index/doc/index.html" rel="nofollow">Boost.MultiIndex</a> nützlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225976</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 09 Feb 2007 21:57:23 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfache Ersetung in strings on Sun, 11 Feb 2007 22:10:09 GMT]]></title><description><![CDATA[<ol>
<li></li>
</ol>
<p>Brauch' ich nicht zwingend - bzw. Brute Force ist in meinem Fall sicher ausreichend. (Anwendungsfall wäre Ersetzen von Umgebungsvariaben in einer befehlszeile - mein Ausgangspunkt war ähnlich).</p>
<p>Ich hab' geknobelt ob mir was fundamental besseres als &quot;jeder string an jedem zeichen&quot; einfällt, aber außer ein paar kleineren Optimierungen fällt mir nix ein.</p>
<p>2. sortierug der map ist egal (muß nicht mal eine map sein)</p>
<p>Mein Ansatz war etwas anders:</p>
<pre><code>für alle zeichen ch in s
  in map: suche bereich aller strings die mit ch beginnen
    probiere alle strings im bereich
</code></pre>
<p>hat zwar eine binäre suche, fällt aber sofort auf linear zurück, wenn alle Schlüssel mit dem gleichen zeichen beginnen (was häufig sein wird).</p>
<p>Ich hab versucht, die map mit greater&lt;&gt; zu sortieren, damit längere strings zuerst kommen, aber dann bekomm ich mit lower_bound einen totalen Knoten im Kopf, scheint wohl nicht wirklich was zu nutzen.</p>
<p>Michael E. schrieb:</p>
<blockquote>
<p>Das ist eklig</p>
</blockquote>
<p>Aber nutzerfreundlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Mein Ansatz war folgender: für &quot;IgnoreCase&quot; werden die Schlüsselstrings nach Lowercase umgewandelt (damit sie hintereinander liegen), und die vergleiche dann halt case insensitive (weil s nicht nach lowercase umgewandelt werden kann)</p>
<p>Naja, falls jemand noch eine Idee (oder einen link) hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1227107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1227107</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Sun, 11 Feb 2007 22:10:09 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfache Ersetung in strings on Mon, 12 Feb 2007 07:04:46 GMT]]></title><description><![CDATA[<p>Zu 1: Der Standardvergleich für Strings definiert eine lexikografische Ordnung (das bedeutet: wie im Wörterbuch) - wenn du etwas anderes benötigst, mußt du einen eigenen Vergleichs-Funktor schreiben.</p>
<p>Zu 2: Entweder du definierst dir eine Spezialisierung der basic_string für Case-Insensitive Strings (du kannst dir die aus meinem Artikel &quot;Stringverarbeitung im C++&quot; nehmen) oder du definierst einen Vergleichsfunktor, der Großschreibung ignoriert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1227162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1227162</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 12 Feb 2007 07:04:46 GMT</pubDate></item></channel></rss>