2017-01-07 3 views
2

Ich baue einen JavaScript-Rechner, und alles ist fertig, außer es gibt ein Problem. wenn ein Benutzer in:Erkennen Sie sich wiederholende Zeichen zurück zu Javascript

3**3 or 7++2 

Dies bringt einen Parsing-Fehler auf - Wie erkenne ich, ob es Duplikate Rücken an Rücken?

Wenn wir die Zeichenfolge 3+3+3*2 aussehen, Das wird sicher sein, zu verwenden dachte, wenn wir den String 3++3+2 verwenden, dass, da die Back-to-back gekennzeichnet werden würde + ist nicht erlaubt.

Wenn also zwei Zeichen desselben Typs Typ oder Ascii-Wert sind, dann kennzeichnen Sie diese Zeichenfolge als unsicher zu verwenden.

+1

Was hat dies mit HTML zu tun? Wie sollen wir wissen, wie man aufeinanderfolgende sich wiederholende Zeichen erkennt, wenn wir keine Informationen darüber haben, wie Sie die Zeichenkette analysieren? Möchten Sie, dass ein regexp wiederkehrende Zeichen erkennt? Dann googlen Sie nach "javascript regexp backreference", und/oder versuchen Sie '/ (.) \ 1 /'. –

+0

Sie sollten es nicht so machen, auch wenn Regex funktioniert nur nicht die richtige Art und Weise zu tun. Was, wenn Sie wollen Taschenrechner, um kleine komplexe Ausdrücke zu haben.Was Sie brauchen, ist ein Parsing-Algorithmus.Brechen Sie zuerst Ihre Zeichenfolge in Tokens und verwenden Sie dann 'recusive decent parsing' techinque.Wenn Sie darauf bestehen, eine einfache Möglichkeit zu verwenden, können Sie nach' Shunting Yard' Algorithmus suchen. es kann dauern, aber Sie werden auf der richtigen Spur sein – anekix

+0

im Grunde drückt der Benutzer eine Zahl auf dem Rechner, und der Ausdruck wird in einer Zeichenfolge zurückgegeben, und ich verwende math.js, um die Zeichenfolge zu bewerten.Es funktioniert tatsächlich überraschend gut für alle Berechnungen, aber das war nur zum Spaß, ich werde einen Blick darauf werfen, danke. – jalen201

Antwort

2

Sie können das letzte Element in der Konsole abrufen, und wenn es ein Operator ist, dann return false. Bedenken Sie:

var operator = "/*+-^"; 
 
var arithmetic = "", lastItem; 
 

 

 
$("span").click(function(){ 
 
    // check if number is clicked  
 
     if($(this).hasClass("num")){ 
 
     $("#console").append($(this).text()); 
 
     arithmetic += $(this).text(); 
 
     } 
 

 
     //get the last item on the console or in arithmetic string 
 
    lastItem = arithmetic.substr(arithmetic.length-1, arithmetic.length); 
 
    //check if last item is an operator, prevent click of an operator again 
 
     if($(this).hasClass('operator')){ 
 
      if(operator.indexOf(lastItem) > -1){ 
 
      return false; 
 
      } 
 
      else{ 
 
       $("#console").append($(this).text()); 
 
       arithmetic += $(this).text(); 
 
      } 
 

 
     }// end if --> checking operator ended. 
 
    if($(this).hasClass('equal')){ 
 
     $("#result").append(eval(arithmetic)); 
 
      } 
 
     
 
    });
span{ 
 
    padding: 5px; 
 
    background: #ccc; 
 
    margin: 5px; 
 
    cursor: pointer; 
 
    text-align: center; 
 
    -moz-user-select: none; 
 
    -webkit-user-select: none; 
 
    -ms-user-select: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<span class="num">1</span> 
 
<span class="num">2</span> 
 
<span class="num">3</span> 
 
<span class="operator">+</span> 
 
<span class="operator">*</span> 
 
<span class="equal">=</span><br/><br/> 
 

 
<div id="console"> </div> <br/> 
 
<div id="result"> </div>

+1

das ist, was ich gesucht habe – jalen201

2

var regexp = /(\+\+|\-\-|\*\*)/; 
 
regexp.test("22++33");

Per gleichen Vorschlag können Sie einfach das Spiel über regex bekommen.

Verwandte Themen