<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[devshare.de - Pseudo-Taschenrechner --> String-Test auf Zahlen und Pluszeichen]]></title>
		<link>http://devshare.de/topic/41325/pseudotaschenrechner-stringtest-auf-zahlen-und-pluszeichen/</link>
		<description><![CDATA[Die neusten Beiträge in Pseudo-Taschenrechner --> String-Test auf Zahlen und Pluszeichen.]]></description>
		<lastBuildDate>Sun, 06 Aug 2006 17:45:03 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Pseudo-Taschenrechner --> String-Test auf Zahlen und Pluszeichen]]></title>
			<link>http://devshare.de/post/46474/#p46474</link>
			<description><![CDATA[<p>N&#039;abend</p><p>ich weiß en detail nicht, wie sich regexes in Access verhalten, aber ich<br />glaube, ziemlich ähnlich zu denen in javascript.<br />D.h., es gibt dann doch einige Dinge, die zwar in perl, oder auch zB. python <br />relativ locker gehn, aber hier nicht.<br />So ist zB. das &quot;sone Sache&quot; mit der Formulierung beliebiger Ober - bzw. Untergrenzen<br />im pattern selbst, oder auch dem Aufspüren von Verdopplungen.</p><p>Ein grober Versuch einer Erklärung (genauer geht&#039;s momentan nicht, alldieweil<br />Ferien sind und das Haus voller Kinder):</p><br /><div class="codebox"><pre><code>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;regex&lt;/title&gt;
&lt;script&gt;

var    og =  &#039;11&#039;,
       ug =  &#039;-25&#039;,

     test = [&quot; 10 +  +9 + 11 +  -9 + -8 &quot;,
             &quot; 10 +  +9 + 11 +   9 + -8 &quot;,
             &quot; 10 +  + 9 + 11 +   9 + -8 &quot;,
             &quot; 10 +  +9 + 11 +  19 + -8 &quot;,
             &quot; 10 +  +9 + 11 + -77 + -8 &quot;,
             &quot; -7 + -17&quot;,
             &quot; -7 + - 17&quot;,
             &quot; rumumbel &quot;,
             &quot; 00 &quot;
            ],


       rg = /^\s*[-+]?\d\d*\s*(\+\s*[-+]?\d\d*\s*)*$/,
       rz = /[-+]?\d\d*/g,

       // es folgt das gleiche in grün, nochmal ausführlicher und diesmal unter
       // Verwendung des Konstruktors  =&gt;  new RegExp( pattern [, option[s]] )

       rg  =  new RegExp( &#039;^\\s*[-+]?\\d\\d*\\s*(\\+\\s*[-+]?\\d\\d*\\s*)*$&#039; ),

       // das sieht ziemlich blöde aus, also nochmal in übersichtlich, aufgeteilt
       // in kleine appetitliche häppchen, die dann zusammenfügt werden:

        v  =  &#039;[-+]?&#039; ,    // vorzeichen ( entweder + oder minus ), mit dem
                           // ?-quantifier, also: ein- oder keinmal

        d  =  &#039;\\d&#039;   ,    // ziffer, digit, von 0 bis neun, kann auch
                           // als zeichenklasse geschrieben werden: [0-9],
                           // oder auch [0123456789]
                           // eigentlich: \d, aber weil in string: \\d

       db  =  &#039;\\d*&#039;  ,    // dasselbe mit *-quantifier, also: beliebig oft ( 0, 1, oder mehr)

        w  =  &#039;\\s*&#039;  ,    // beliebig viel whitespace

       tr  =  &#039;\\+&#039;   ,    // beliebiges trennzeichen, hier ein literales +
                           // ein escape wg. sonderzeichen und
                           // ein escape wg. escape des escapes in string
                           // das + ist ein regex sonderzeichen:
                           // der +-quantifier ( mindestens einmal, oder beliebig oft )

        z  =  v + d + db,  // beliebige zahl

       zw  =  w + z + w,   // dito, mit umgebenden beliebigem whitespace


       rg  =  new RegExp( &#039;^&#039;  +         // anker: zeilenanfang, hier stringanfang

                          zw   +

                          &#039;(&#039;  +         // einfangende und gruppierende klammer öffnend

                          tr   +

                          zw   +

                          &#039;)*&#039; +         // einfangende und gruppierende klammer schließend
                                         // mit *-quantifier: beliebig oft

                          &#039;$&#039;            // anker: zeilenende, hier stringende
                        ),

       rz  = new RegExp( z, &#039;g&#039; )        // g ist die option für&#039;s globale matching
                                         // d.h.: finde jedes vorkommen diese patterns im
                                         // gegebenen string


alert( rg + &#039;\n\n&#039; + rz )                // nur mal zum guggen, ob die konstruierten
                                         // regexes auch hinhaun

if ( !isNaN( og*1 ) &amp;&amp; !isNaN( ug*1 ) )  // sind og und ug tatsächlich brauchbare zahlen
if ( og*1 &gt;= ug*1 )                      // und ist og wirklich mindestens so groß wie ug
  for( var i in test )
     {  var x, y,
            a = [],
            s = 0,
            f = 0

        if( x = rg.exec( test[i] ) )       // stimmt die struktur insgesamt?
          {
            if( x[1] )                     // das ist der sinn der einfangenden klammer:
                                           // wenn sich nach der ersten zahl mindestens ein
                                           // vorkommen des musters \+\s*[-+]?\d\d*\s* findet
              {
                while( y = rz.exec( test[i] ) ) a.push( y*1 )  // schaufle alle  [-+]?\d\d*  als
                                                               // numerische werte ins array a

                for ( var j = 0; j &lt; a.sort().length; j++ )    // array a wird aufsteigend
                                                               // sortiert und auf doppelte
                                                               // nachbarn abgeklopft bzw. og und ug
                  if( a[j] == a[j+1] )
                    { alert(&#039;test[&#039; + i + &#039;] &#039; + a[j] + &#039; ist doppelt\n\n:&#039; + test[i]);
                      s = 0;
                      f = 1;
                      break;
                    }
                  else if( a[j] &gt; og*1 )
                    { alert(&#039;test[&#039; + i + &#039;] &#039; + a[j] + &#039; ist zu groß\n\n:&#039; + test[i]);
                      s = 0;
                      f = 1;
                      break;
                    }
                  else if( a[j] &lt; ug*1 )
                    { alert(&#039;test[&#039; + i + &#039;] &#039; + a[j] + &#039; ist zu klein\n\n:&#039; + test[i]);
                      s = 0;
                      f = 1;
                      break;
                    }
                  else  s += a[j]
               }

             else  s = x[0]*1

             if( !f ) alert( &#039;test[&#039; + i + &#039;] &#039; +  &#039;  summe =&gt; &#039; + s)
          }

        else  alert( &#039;test[&#039; + i + &quot;]  nüscht wg:\n\n&quot; + test[i] )
     }
else  alert( og + &#039; kleiner &#039; + ug)
else  alert( &#039; tja, zahlen sind halt ein eher abstraktes konzept &#039;)

&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre></div><p>gruß</p><p>matho</p>]]></description>
			<author><![CDATA[dummy@example.com (matho)]]></author>
			<pubDate>Sun, 06 Aug 2006 17:45:03 +0000</pubDate>
			<guid>http://devshare.de/post/46474/#p46474</guid>
		</item>
		<item>
			<title><![CDATA[Re: Pseudo-Taschenrechner --> String-Test auf Zahlen und Pluszeichen]]></title>
			<link>http://devshare.de/post/46473/#p46473</link>
			<description><![CDATA[<p>Moin Moin alter Freund,</p><p>vielen Dank für die schnelle - und wie immer voll befriedigende - Antwort.<br />Habe das letzte Pattern einfach mal in mein Access reingehaun und siehe da - alles wie gewünscht. Incl. Bereichsgrenzentest.<br />Aber verstanden habe ich es nicht... Ärgert mich!<br />Ich werde mir mal in Ruhe das einfache zur Hand nehmen und damit rumspielen. Kann nicht sein, daß das nicht in meinen Schädel will <img src="http://devshare.de/img/smilies/wink.png" width="15" height="15" alt="wink" /></p><p>Vielen Dank und viele liebe Grüße<br />Thomas</p><p>P.S.<br />Ich bin seit ca. 4 Jahren in Deiner relativen Nähe (wenn ich mich so recht erinnere, man wird halt nicht jünger und die Mails sind mit einem Rechnerumzug alle mal flöten gegangen). In der Regel 4-Tage-Woche und dann ab nach Hause - 600km.</p>]]></description>
			<author><![CDATA[dummy@example.com (wintelknecht)]]></author>
			<pubDate>Wed, 02 Aug 2006 16:54:04 +0000</pubDate>
			<guid>http://devshare.de/post/46473/#p46473</guid>
		</item>
		<item>
			<title><![CDATA[Re: Pseudo-Taschenrechner --> String-Test auf Zahlen und Pluszeichen]]></title>
			<link>http://devshare.de/post/46472/#p46472</link>
			<description><![CDATA[<p>Hallo, alter Freund</p><p>ich bin momentan ein wenig in Eile, deshalb in Kürze:</p><p>Klammern (also die runden) kann man ua. benutzen, um<br />sich Teilausdrücke zu merken. Braucht man das nicht, <br />setzt man hinter die öffnende Klammer ein ?:</p><br /><p>Ja nachdem, welche Umgebung man hat, ist das regex-Maschinchen<br />verschieden gestrickt und erlaubt dieses oder jenes nicht und anderes<br />anders uswusfetcppp...</p><p>Wie gesagt, auf die Schnelle, javascript: </p><br /><div class="codebox"><pre><code>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;regex&lt;/title&gt;
&lt;script&gt;

var test = [ &#039; 1 +    0&#039;,
             &#039;   1   + q&#039;,
             &#039; 1 +    &#039;,
             &#039;  + 2&#039;,
             &#039;   a +11&#039;,
             &#039; y + x&#039;,
             &#039;12   +  45  &#039;,
             &#039;11   +  10  &#039;,
             &#039;    + &#039;,
             &#039;  2 + 0 + 12  &#039;,
             &#039;  2 + 0 + 11  &#039;,
             &#039; 4 + 0 + z &#039;,
             &#039;   17&#039;,
             &#039;201b  &#039;,
             &#039;  007 + 3 + 0006 &#039;,
             &#039; 00003 + 0815&#039;,
             &#039; 00 &#039;
           ],

      rg = /^\s*\d+\s*(?:\+\s*\d+\s*)*$/,                        // alle Zahlen, naja,
                                                                 // du weißt schon...

      rg = /^\s*(?:\d|1[01])\s*(?:\+\s*(?:\d|1[01])\s*)*$/,      // nur Zahlen bis 11

      rg = /^\s*0*(?:\d|1[01])\s*(?:\+\s*0*(?:\d|1[01])\s*)*$/,  // nur Zahlen bis 11
                                                                 // 007 ist erlaubt

       x = &#039;&#039;


for (var i in test)
 x += test[i] + &#039;   =&gt;   &#039; + (rg.exec(test[i]) ? &#039;ok&#039; : &#039;KO&#039;) + &#039;\n&#039;

alert(x)

&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre></div><p>gruß <br />matho</p><p>Bei Unklarheiten bitte fragen, Antwort kann ein, zwei Tage dauern.</p>]]></description>
			<author><![CDATA[dummy@example.com (matho)]]></author>
			<pubDate>Wed, 02 Aug 2006 10:34:04 +0000</pubDate>
			<guid>http://devshare.de/post/46472/#p46472</guid>
		</item>
		<item>
			<title><![CDATA[Pseudo-Taschenrechner --> String-Test auf Zahlen und Pluszeichen]]></title>
			<link>http://devshare.de/post/46470/#p46470</link>
			<description><![CDATA[<p>Blauäugig wie ich bin dachte ich: Machste mal RegEx. Halbe Stunden lesen und dann los.<br />Fazit: Mindestens einen halben Tag gelesen und probiert und dann aufgegeben <img src="http://devshare.de/img/smilies/sad.png" width="15" height="15" alt="sad" /></p><p>Problem:<br />1) 1+2+5+11&nbsp; --&gt; gültig<br />2) 1&nbsp; --&gt; gültig<br />3) 1 +&nbsp; 5&nbsp; --&gt; gültig<br />4) 1+&nbsp; --&gt; ungültig<br />5) 1+q&nbsp; --&gt; ungültig<br />6) 1+12&nbsp; --&gt; ungültig (optional)<br />7) 1+1 --&gt; ungültig (optional)</p><p>Deshalb Pseudo-Taschenrechner. Ist es aber nicht. Das &quot;Plus&quot; dient nur als Verbinder, es könnte auch ein Komma oder sonstwas sein.<br />Bereich der Zahlen sollte optional fest eingegrenzt sein. Sagen wir mal von 1 bis 11. Ebenfalls optional ist, daß jede Zahl nur einmal vorkommt.</p><p>Fall 1) bis 3)<br />- nur Zahlen, Leerzeichen und &quot;Plus&quot; da sind<br />- auf jede Zahl genau ein &quot;Plus&quot; folgt<br />- am Ende und am Anfang eine Zahl steht<br />Fall 4)<br />- am Ende fehlt die Zahl<br />Fall 5)<br />- Buchstabe enthalten<br />Fall 6) - optional<br />- Zahl außerhalb des Bereiches<br />Fall 7) - optional<br />- Zahl kommt doppelt vor</p><p>Nun habe ich was von Automaten gelesen und denke mir, daß es so &quot;ein bissel&quot; wie programmieren ist.<br />- am Anfang muß eine Zahl stehen<br />- es dürfen nur Zahlen da sein<br />- auf jede Zahl muß genau ein Plus folgen<br />- das Plus darf in beliebig viele Leerzeichen eingefaßt sein (und zwar nur in Leerzeichen)<br />- es darf kein Buchstabe vorkommen<br />- am Ende muß eine Zahl stehen</p><p>Hm. Hat auch nicht weitergeholfen.<br />Wenn ich das nämlich versuche umzusetzen entsteht folgendes:<br />(^\d*)(\s*)(\+)(\s*)(\d*$)(![a-z])<br />Ist aber glaub ich vollkommener Mist! Und das mit den &quot;(&quot; Klammern hab ich auch nicht so richtig verstanden - gesundes Halbwissen <img src="http://devshare.de/img/smilies/wink.png" width="15" height="15" alt="wink" /></p><p>Ist meine prinzipielle Herangehensweise falsch? Falls nein, wie gehts dann konkret. Falls ja, wie sollte ich es mir vorstellen?</p><p>Kann mir einer helfen?</p><p>Danke und viele Grüße.</p>]]></description>
			<author><![CDATA[dummy@example.com (wintelknecht)]]></author>
			<pubDate>Tue, 01 Aug 2006 14:25:05 +0000</pubDate>
			<guid>http://devshare.de/post/46470/#p46470</guid>
		</item>
	</channel>
</rss>

