<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://powershell.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Dreaming in PowerShell : foreach, Switch</title><link>http://powershell.com/cs/blogs/tobias/archive/tags/foreach/Switch/default.aspx</link><description>Tags: foreach, Switch</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Multiple Text Replacement Challenge</title><link>http://powershell.com/cs/blogs/tobias/archive/2011/04/28/multiple-text-replacement-challenge.aspx</link><pubDate>Thu, 28 Apr 2011 02:45:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:10170</guid><dc:creator>Tobias</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=10170</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2011/04/28/multiple-text-replacement-challenge.aspx#comments</comments><description>&lt;p&gt;Ready for a challenge? Here it is: &lt;em&gt;&lt;strong&gt;take a text, and replace a number of different characters. How would you do that?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I wanted PowerShell to replace all German special characters with alternative text. Boy, was I in for a surprise! &lt;/p&gt;
&lt;p&gt;If you&amp;#39;d like to take on the challenge, &lt;strong&gt;pause&lt;/strong&gt; reading now and go find a good solution! &lt;strong&gt;Then come back&lt;/strong&gt; and compare it with the solutions that came to my mind. &lt;/p&gt;
&lt;p&gt;Ok, if you do take on&amp;nbsp;the challenge, this is the text to work with:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;sterreich &amp;auml;rgert s&amp;uuml;&amp;szlig;e kl&amp;ouml;tenhafte &amp;Auml;rgonauten&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;*&lt;/span&gt;&lt;/span&gt; 1000&lt;/div&gt;
&lt;p&gt;The job is to do the following replacements:&lt;/p&gt;
&lt;p&gt;&amp;auml; = ae, &amp;ouml; = oe, &amp;uuml; = ue, &amp;Auml; = Ae, &amp;Ouml; = Oe, &amp;Uuml; = Ue, &amp;szlig; = ss&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can &lt;strong&gt;download&lt;/strong&gt; all code samples on this page right here: &lt;a href="http://powershell.com/cs/media/p/10171.aspx"&gt;http://powershell.com/cs/media/p/10171.aspx&lt;/a&gt;. &lt;/p&gt;
&lt;h2&gt;Creative Solutions using Switch&lt;/h2&gt;
&lt;p&gt;You can use &lt;strong&gt;Switch&lt;/strong&gt; to do multiple string replacements. For it to work, you would need to split the text in characters first, do the replacements, then -&lt;strong&gt;join&lt;/strong&gt; it together. &lt;/p&gt;
&lt;p&gt;The code is clean, and it&amp;#39;s easy to edit the replacement table:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;sterreich &amp;auml;rgert s&amp;uuml;&amp;szlig;e kl&amp;ouml;tenhafte &amp;Auml;rgonauten&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;*&lt;/span&gt;&lt;/span&gt; 1000&lt;br /&gt;&lt;br /&gt;&lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-join&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$&lt;/span&gt;&lt;/span&gt;(&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;switch&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-case&lt;/span&gt;&lt;/span&gt; ( [&lt;span class="datatype"&gt;&lt;span style="color:#0000ff;"&gt;Char&lt;/span&gt;&lt;/span&gt;[]]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; ) {&lt;br /&gt;&amp;auml; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ae&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&amp;ouml; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;oe&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&amp;uuml; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ue&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&amp;Auml; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Ae&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&amp;Ouml; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Oe&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&amp;Uuml; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Ue&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&amp;szlig; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ss&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;default { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;})&lt;/div&gt;
&lt;p&gt;With 883 milliseconds, this approach takes a long time to run, though. Bummer.&lt;/p&gt;
&lt;h2&gt;Creative Solutions Using Hashtables&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hashtables&lt;/strong&gt; are another good way of providing replacement tables in a way that makes it easy to edit and adjust them.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;However, since PowerShell creates hashtables with &lt;strong&gt;case-insensitive keys&lt;/strong&gt;, it is not possible to differentiate between lower case and upper case keys. &lt;/p&gt;
&lt;p&gt;The workaround here is to get the hashtable from &lt;strong&gt;.NET&lt;/strong&gt; directly. This way, &lt;strong&gt;keys are case-sensitive&lt;/strong&gt;. Here is the solution:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;sterreich &amp;auml;rgert s&amp;uuml;&amp;szlig;e kl&amp;ouml;tenhafte &amp;Auml;rgonauten&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;*&lt;/span&gt;&lt;/span&gt; 1000&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;new-object&lt;/span&gt;&lt;/span&gt; &lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;System.Collections&lt;/span&gt;&lt;/span&gt;.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;Hashtable&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;auml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;ae&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;ouml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;oe&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;uuml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;ue&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;Auml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Ae&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;Ouml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Oe&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;Uuml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Ue&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;szlig;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;ss&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;[&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;Regex&lt;/span&gt;&lt;/span&gt;]::&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Replace&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;[$(-join $ht.keys)]&amp;quot;&lt;/span&gt;&lt;/span&gt;, {&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;[&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$Args&lt;/span&gt;&lt;/span&gt;[0].&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Value&lt;/span&gt;&lt;/span&gt;]})&lt;/div&gt;
&lt;p&gt;With 405 milliseconds, this approach is a lot faster. However, it is still relatively slow, and the way the text is actually replaced is a bit complex, using a regex replacement with a dynamic function.&lt;/p&gt;
&lt;h2&gt;Using a Replacement Table - Much Faster&lt;/h2&gt;
&lt;p&gt;I did like the idea of using a hash table as a replacement table, though. I did not like the complex regex clause, and of course I wanted it faster. &lt;/p&gt;
&lt;p&gt;So here is the next version. It uses a &lt;strong&gt;foreach&lt;/strong&gt; loop and the &lt;strong&gt;-creplace&lt;/strong&gt; operator:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;sterreich &amp;auml;rgert s&amp;uuml;&amp;szlig;e kl&amp;ouml;tenhafte &amp;Auml;rgonauten&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;*&lt;/span&gt;&lt;/span&gt; 1000&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;new-object&lt;/span&gt;&lt;/span&gt; &lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;System.Collections&lt;/span&gt;&lt;/span&gt;.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;Hashtable&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;auml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;ae&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;ouml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;oe&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;uuml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;ue&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;Auml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Ae&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;Ouml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Oe&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;Uuml;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Ue&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&amp;szlig;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;ss&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$key&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Keys&lt;/span&gt;&lt;/span&gt;) { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-creplace&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$key&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ht&lt;/span&gt;&lt;/span&gt;.&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$key&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;This code &lt;strong&gt;just takes 7,3 milliseconds&lt;/strong&gt;, so it runs &lt;strong&gt;55x faster&lt;/strong&gt; - wow. Can it run even faster? &lt;/p&gt;
&lt;h2&gt;Hard Coding - and a Big Surprise&lt;/h2&gt;
&lt;p&gt;Inspired by the top performance &lt;strong&gt;-creplace&lt;/strong&gt; delivered, I next tried a hard-coding approach:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;sterreich &amp;auml;rgert s&amp;uuml;&amp;szlig;e kl&amp;ouml;tenhafte &amp;Auml;rgonauten&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;*&lt;/span&gt;&lt;/span&gt; 1000&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-creplace&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;auml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ae&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-creplace&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;ouml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;oe&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-creplace&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;uuml;&amp;#39;&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ue&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-creplace&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Auml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Auml;e&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-creplace&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Oe&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-creplace&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Uuml;&amp;#39;&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Ue&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-creplace&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;szlig;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ss&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Surprisingly, this code was &lt;strong&gt;not faster&lt;/strong&gt; than the previous approach. Considering how ugly and unflexible this code was, I moved on immediately in disgust.&lt;/p&gt;
&lt;h2&gt;Hard Coding again - and another Surprise&lt;/h2&gt;
&lt;p&gt;Next, I tried another hard-coded approach, this time using &lt;strong&gt;string methods&lt;/strong&gt; over regular expressions:&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;sterreich &amp;auml;rgert s&amp;uuml;&amp;szlig;e kl&amp;ouml;tenhafte &amp;Auml;rgonauten&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;*&lt;/span&gt;&lt;/span&gt; 1000&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Replace&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;auml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ae&amp;#39;&lt;/span&gt;&lt;/span&gt;).&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Replace&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;ouml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;oe&amp;#39;&lt;/span&gt;&lt;/span&gt;).&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Replace&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;uuml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ue&amp;#39;&lt;/span&gt;&lt;/span&gt;).&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Replace&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Auml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Ae&amp;#39;&lt;/span&gt;&lt;/span&gt;).&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Replace&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Oe&amp;#39;&lt;/span&gt;&lt;/span&gt;).&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Replace&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Uuml;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Ue&amp;#39;&lt;/span&gt;&lt;/span&gt;).&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Replace&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;szlig;&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;ss&amp;#39;&lt;/span&gt;&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;While this code was ugly, too, &lt;strong&gt;with just 2 milliseconds it ran lightning fast&lt;/strong&gt;. There is no faster way for multiple string replacements.&lt;/p&gt;
&lt;h2&gt;Dynamic Code Combines Best of Both Worlds&lt;/h2&gt;
&lt;p&gt;So I finally was looking for a way to take advantage of the speed yet create a code design that would allow it to&amp;nbsp;edit and adjust&amp;nbsp;the replacement strings dynamically. Here it is:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;&amp;Ouml;sterreich &amp;auml;rgert s&amp;uuml;&amp;szlig;e kl&amp;ouml;tenhafte &amp;Auml;rgonauten&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;*&lt;/span&gt;&lt;/span&gt; 1000&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$t&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;&amp;auml;,ae,&amp;ouml;,oe,&amp;uuml;,ue,&amp;Auml;,Ae,&amp;Ouml;,Oe,&amp;Uuml;,Ue,&amp;szlig;,ss&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Invoke-Expression&lt;/span&gt;&lt;/span&gt; (&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;$text&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;+&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-join&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$&lt;/span&gt;&lt;/span&gt;(&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$e&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$t&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Split&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;/span&gt;)) { &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;.Replace(&amp;quot;{0}&amp;quot;,&amp;quot;{1}&amp;quot;)&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-f&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$e&lt;/span&gt;&lt;/span&gt;, &lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$&lt;/span&gt;&lt;/span&gt;([&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;/span&gt;]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$foreach&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;MoveNext&lt;/span&gt;&lt;/span&gt;();&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$foreach&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Current&lt;/span&gt;&lt;/span&gt;) &lt;br /&gt;} &lt;br /&gt;))&lt;/div&gt;
&lt;p&gt;With still less than 3 milliseconds, this &lt;strong&gt;approach was super fast, 338x faster than the original approach&lt;/strong&gt;. Note how it uses &lt;strong&gt;Invoke-Expression&lt;/strong&gt; to actually &lt;strong&gt;generate dynamic code on-the-fly&lt;/strong&gt;, so it is no longer hard-coding the replacement strings. With the list of replacement texts in &lt;strong&gt;$t&lt;/strong&gt;, it is very easy to adjust. So I decided to stick with this one and make it a function:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Update-Text&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;param&lt;/span&gt;&lt;/span&gt;(&lt;br /&gt;[Parameter(Mandatory&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;)]&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$text&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$replacementlist&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;&amp;auml;,ae,&amp;ouml;,oe,&amp;uuml;,ue,&amp;Auml;,Ae,&amp;Ouml;,Oe,&amp;Uuml;,Ue,&amp;szlig;,ss&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;)&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Invoke-Expression&lt;/span&gt;&lt;/span&gt; (&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;$text&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;+&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-join&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$&lt;/span&gt;&lt;/span&gt;(&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$e&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$replacementlist&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Split&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;/span&gt;)) { &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;.Replace(&amp;quot;{0}&amp;quot;,&amp;quot;{1}&amp;quot;)&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-f&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$e&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$&lt;/span&gt;&lt;/span&gt;(&lt;br /&gt;[&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;/span&gt;]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$foreach&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;MoveNext&lt;/span&gt;&lt;/span&gt;()&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$foreach&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Current&lt;/span&gt;&lt;/span&gt;) &lt;br /&gt;} &lt;br /&gt;)&lt;br /&gt;)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS &amp;gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Update-Text&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;This is a test&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;T,t,i,I,te,TE&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;thIs Is a TEst&lt;/div&gt;
&lt;p&gt;Hope to see you next week,&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;Microsoft MVP PowerShell Germany&lt;/p&gt;
&lt;p&gt;P.S.&lt;br /&gt;If you live in Germany or other parts of Europe and your company would like to set up a truly great PowerShell training, just contact me! I regularly train mid- to large-size companies. Trainings are always a blast with tons of real-world-examples and solutions. Here&amp;#39;s how to get in touch with me: &lt;a href="mailto:tobias.weltner@scriptinternals.de"&gt;&lt;span style="color:#3366cc;"&gt;tobias.weltner@scriptinternals.de&lt;/span&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=10170" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Split/default.aspx">Split</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/performance/default.aspx">performance</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/foreach/default.aspx">foreach</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Text/default.aspx">Text</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Invoke-Expression/default.aspx">Invoke-Expression</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Replace/default.aspx">Replace</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Switch/default.aspx">Switch</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/-creplace/default.aspx">-creplace</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/-replace/default.aspx">-replace</category></item></channel></rss>