使用正则表达式匹配特定数字的Javascript

时间:2010-05-07 20:05:10

标签: javascript regex

我正在使用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 个答案:

答案 0 :(得分:6)

这是完全错误的方法。

要回答这个问题,正则表达式匹配部分字符串。字符串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;
    };
}

答案 1 :(得分:2)

您需要指定字符串的开头和结尾。否则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)) {
    // …
}

答案 2 :(得分:1)

如果你像/\b(100|101)/g这样定期表达,它只会匹配100和101而不是5100,5101或...... 101 ......;

唯一的问题是如果您使用的是负数,例如101和-101都与正则表达式匹配。

我知道这是因为我正面临并希望避免。

答案 3 :(得分:0)

我可以和你分享一个例子:

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"]

就是这样。棘手的部分是首先要认识到正则表达式可用于字符串,其次是一旦获得字符串,我就不得不考虑要获取的数字不是我要的数字,而是要被其他字符包围的字符串并与其他角色接触,有助于找到解决方案。