2017-06-18 3 views
3

Ich habe dieses Stück Code:Regular Expression Punkt und Komma Ausgabe

if(calcValue.search('[^0-9\*\+\-\/]') > -1) { 
    jQuery('.output-field').text('Error: you can use only numbers and "+", "*", "-", "/" symbols'); 
    } 

Und diese regulären Ausdruck:

[^0-9\*\+\-\/] 

alle Symbole ausschließen müssen, mit Ausnahme 0-9 Ziffern und Symbole: + , -, * und/aber irgendwie schließt es Punkte und Kommas nicht aus. Wie kann man Punkte und Kommas ausschließen?

Sie können auch den Code here überprüfen: Es wird eine Fehlermeldung angezeigt, wenn Sie etwas außer Zahlen, erlaubten Symbolen und aus unbekannten Gründen Punkte und Kommas eingeben.

Antwort

2

Sie verwenden nicht korrekt. Es erwartet eine Regex - entweder ein /regex literal/ oder ein new RegExp Objekt - aber Sie geben es eine Zeichenfolge.

Per documentation wird der übergebene Nicht-Regex implizit in einen konvertiert, der new RegExp(arg) verwendet.

Sie übergeben das String-Literal '[^0-9\*\+\-\/]', das die Zeichenfolge [^0-9*+-/] wird. Dies wird dann weitergegeben implizit als new RegExp('[^0-9*+-/]') und die resultierende Zeichenklasse umfasst +-/, was +,-./ erweitert und das ist, wo das Komma und Punkt in erlaubt sind.

Ich habe zwei Ratschläge hier.

Die erste und offensichtlichste Methode besteht darin, immer den erwarteten Datentyp zu übergeben. In diesem Fall eine Regex.

Die zweite ist vorsichtiger mit Ihren Fluchten. Sie können im besten Fall knifflig sein und es gibt viele zu vermeidende Traps - besonders, wenn das Parsing zweimal stattfindet (einmal für die Zeichenkette, einmal für die Regex). Quantifizierer müssen in einer Zeichenklasse nicht maskiert werden, und das Trennzeichen / muss nicht entfernt werden, außer wenn Sie eine /regex literal/ verwenden. Darüber hinaus muss die Bereichsangabe - nicht entfernt werden, wenn es das erste oder letzte Zeichen in der Zeichenklasse ist.

Folglich meine vorgeschlagene Lösung ist:

if(calcValue.search(new RegExp('[^0-9/*+-]')) > -1) 
+0

'die sich ausdehnt zu +, -./'... das ist ein bisschen wie ein Hase. Kannst du kommentieren, wie Komma und Punkt in der Charakterklasse enden?Es scheint mir, dass sie erlaubt sind, weil bestimmte Arten von Zahlen Kommas und Dezimalstellen haben können. Aber das kann ich nicht beweisen. –

+0

@TimBiegeleisen Öffnen Sie die Zeichentabelle und Sie sehen, dass zwischen '+' und '/' die Symbole ',' 'und' .' zu finden sind. Nichts mysteriöses daran, es ist nur ASCII;) –

+0

Zufällig wurden also Punkt und Komma allein eingezogen. Das wäre eine großartige Interviewfrage für jemanden. –

2

Sie search eine Zeichenfolge übergeben können, wie Sie tun, aber die - in Ihrem regulären Ausdruck arbeitet als Bereich (die Fluchten im Stringliteral aufgelöst werden, so sie machen keinen Unterschied für den regulären Ausdruck):

[^0-9*+-/] 

So Ihre Klasse verbietet 0-9, *, +-/, und dieser letzte Bereich enthält einen Punkt und ein Komma (und auch den Bindestrich). So sollten Sie den Bindestrich auf die letzte Position verschieben:

[^0-9*+/-] 

Oder sollten Sie den Bindestrich doppelte Escape (einmal für die Stringliteral und wieder für den regulären Ausdruck):

'[^0-9*+\\-/]' 
+1

Hier ist eine [Demo] (http://rexttester.com/QFWY96398), die zeigt, dass diese Antwort korrekt ist. Das Problem war, dass zwei der Symbole einen unerwarteten Zeichenbereich bildeten. –