2 Stimmen

Javascript zum Abgleich einer bestimmten Zahl mit regulären Ausdrücken

Ich war mit Javascript zu erkennen, für bestimmte Tastenanschläge und beim Schreiben der Methode dachte ich, ich würde versuchen, reguläre Ausdrücke und die test() Methode und kam mit:

if (/8|9|37|38|46|47|48|49|50|51|52|53|54|55|56|57|96|97|98|99|100|101|102|103|104|105|110/.test(num)) {
    // do something if there's a match
}

Dies scheint nicht zu 100 % zu funktionieren, da einige Werte den Regex-Test zu überstehen scheinen, wie z. B. 83. Ich habe inzwischen weitergemacht, aber ich bin immer noch neugierig, warum das nicht funktioniert hat.

6voto

SLaks Punkte 832502

Dies ist die vollständig Das ist der falsche Weg.

Um die Frage zu beantworten: Der Regex passt auf einen Teil der Zeichenkette. Die Zeichenfolge 83 wird durch den Abgleich mit dem 8 .
Sie müssen Ihre Regex verankern, indem Sie ^( am Anfang und )$ am Ende.

El richtig Sie können dies tun, indem Sie eine Reihe gültiger Zahlen erstellen und diese mit parseInt .

Zum Beispiel:

var validNumbers = [ 8, 9, 37, 38, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110 ];

if (validNumbers.indexOf(parseInt(num, 10)) >=0 ) {
    //Match
}

Sie benötigen eine indexOf Funktion für den IE:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(needle) {
        for(var i = 0; i < this.length; i++) {
            if(this[i] === needle) {
                return i;
            }
        }
        return -1;
    };
}

3voto

Gumbo Punkte 617646

Sie müssen den Anfang und das Ende der Zeichenkette angeben. Andernfalls 8 en 8|… wird mit dem 8 en 83 :

/^(8|9|37|38|46|47|48|49|50|51|52|53|54|55|56|57|96|97|98|99|100|101|102|103|104|105|110)$/.test(num)

Sie sollten jedoch lieber einen numerischen Vergleich verwenden. Wenn Sie nicht jede Zahl auflisten möchten, können Sie Bereiche wie diesen verwenden:

function foo(number, numbers) {
    for (var i=0; i<numbers.length; ++i) {
        if (numbers[i] === number) {
            return true;
        } else if (numbers[i].constructor === Array) {
            if (numbers[i][0] <= number && number <= numbers[i][1]) {
                return true;
            }
        }
    }
    return false;
}
var numbers = [8, 9, 37, 38, [46, 57], [96, 105], 110];
if (foo(num, numbers)) {
    // …
}

1voto

Daniel Branco Punkte 69

Wenn Sie einen regulären Ausdruck machen wie /\b(100|101)/g es werden nur 100 und 101 gefunden, nicht aber 5100, 5101 oder ...101..;

Das einzige Problem dabei ist, wenn Sie negative Zahlen verwenden, z. B. im Fall von 101 und -101, die beide mit dem Regexp übereinstimmen.

Ich weiß das, weil es das ist, womit ich konfrontiert bin und was ich vermeiden möchte.

1voto

Janis Punkte 11

Ich kann Ihnen ein Beispiel nennen:

let  array = [89, 7, 92, 78, 899, 65, 56, 92, 922, 292, 289, 389, 2879, 2932, 8999];
  • Ich möchte herausfinden, wie viele Instanzen der Zahl 92 in diesem Array existieren. Ich suche also nach der genauen Zahl 92. Und ich möchte reguläre Ausdrücke in Javascript verwenden.

  • Der erste Teil besteht in der Umwandlung des Arrays in eine Zeichenkette:

    let strCheck = array.toString(); // "89,7,92,78,899,65,56,92,922,292,289,389,2879,2932,8999"

let regex = /\b92\b/g;

Ich habe das Flag g für global verwendet, damit alle Treffer gefunden werden und die \b Wortgrenze wie in MDN beschrieben.

let arrResult = strCheck.match(regex); // ["92", "92"]

Das war's. Der knifflige Teil war erstens die Erkenntnis, dass reguläre Ausdrücke mit Zeichenketten funktionieren, und zweitens, dass ich, sobald ich die Zeichenkette hatte, darüber nachdenken musste, die gewünschte Zahl nicht als Zahl, sondern als Zeichenkette zu erhalten, die von anderen Zeichen umgeben sein würde, und diese anderen Zeichen zu erreichen, half, die Lösung zu finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X