Javascript для соответствия определенному числу с помощью регулярных выражений - PullRequest
1 голос
/ 08 мая 2010

Я использовал javascript для обнаружения определенных нажатий клавиш, и при написании метода я подумал, что попробую регулярные выражения и метод test (), и придумал:

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
}

Похоже, это не работает на 100%, так как некоторые значения, кажется, проходят тест на регулярные выражения, например, 83. С тех пор я перешел, но мне все еще интересно, почему это не сработало.

Ответы [ 4 ]

6 голосов
/ 08 мая 2010

Это полностью неправильный способ сделать это.

Чтобы ответить на вопрос, регулярное выражение совпадает с частью вашей строки. Строка 83 проходит путем сопоставления 8.
Вам нужно закрепить свое регулярное выражение, поставив ^( в начале и )$ в конце.

правильный способ сделать это состоит в том, чтобы создать массив действительных чисел и сравнить, используя parseInt.

Например:

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
}

Для IE вам потребуется функция indexOf:

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;
    };
}
2 голосов
/ 08 мая 2010

Вам необходимо указать начало и конец строки.В противном случае 8 в 8|… будет соответствовать 8 в 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)

Но вам лучше использовать числовое сравнение.Если вам не нравится перечислять каждое число, вы можете использовать такие диапазоны:

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)) {
    // …
}
1 голос
/ 31 мая 2012

Если вы сделаете регулярное выражение, например /\b(100|101)/g, оно будет соответствовать только 100 и 101, а не 5100, 5101 или ... 101 ...;

Единственная проблема с этим, если вы используете отрицательные числа, например, в случае 101 и -101 оба совпадают с регулярным выражением.

Я знаю это, потому что это то, с чем я сталкиваюсь и хочу избегать.

0 голосов
/ 13 декабря 2018

Я могу поделиться с вами примером:

let  array = [89, 7, 92, 78, 899, 65, 56, 92, 922, 292, 289, 389, 2879, 2932, 8999];
  • Я хочу узнать, сколько экземпляров числа 92 существует в этом массиве. Поэтому я ищу точное число 92. И я хочу использовать регулярные выражения в Javascript.

  • Первая часть идет с преобразованием массива в строку:

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

let regex = /\b92\b/g;

Я использовал флаг g для глобального, так что он находит все совпадения и границу слова \ b, как описано в MDN.

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

Вот и все. Сначала было сложно понять, что регулярные выражения работают со строками, а во-вторых, когда я получил строку, мне пришлось подумать о том, чтобы получить нужное число не как число, а как строку, которая будет окружена другими символами. и связь с этими другими персонажами, помогли найти решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...