我正在使用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.我已经继续前进,但我仍然很好奇为什么这不起作用。
答案 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"]
就是这样。棘手的部分是首先要认识到正则表达式可用于字符串,其次是一旦获得字符串,我就不得不考虑要获取的数字不是我要的数字,而是要被其他字符包围的字符串并与其他角色接触,有助于找到解决方案。