我有一个数字列表,如下所示:
使用正则表达式,我如何只获取不以2开头的数字?
所以输出应该如下:
答案 0 :(得分:1)
有多种方法可以实现这一目标(如下所示)。
注意:我知道模式只匹配第一个字符。请阅读整个答案,了解原因(以及如果需要,如何匹配完整的数字)。
用法部分使用每种方法的第一个正则表达式(因为它是对第一个字符的简单验证)。每种方法的第二个正则表达式允许您捕获整个数字,如果这是意图。
此方法需要39步,长度为9(+3)个字符。
\b[013-9]
\b[013-9]\d*
此方法需要63步,长度为9(+1)个字符。
\b(?!2)\d
\b(?!2)\d*
此方法需要39个步骤,长度为8(+3)个字符。
\b[^\D2]
\b[^\D2]\d*
startsWith("2");
假设n
是转换为字符串的数字。
n[0] !== "2"
假设n
是一个正数(我们认为它是肯定的)。
while(n >= 10) {
n = Math.floor(n/10);
}
if(n !== 2)
var nums = [200,302,301,201,205,500];
console.log("Method 1");
var r = /\b[013-9]/g
nums.forEach(function(s){
s = s.toString();
if(s.match(r)) {
console.log(s);
}
});
console.log("\nMethod 2");
var r = /\b(?!2)\d/g
nums.forEach(function(s){
s = s.toString();
if(s.match(r)) {
console.log(s);
}
});
console.log("\nMethod 3");
var r = /\b[^\D2]/g
nums.forEach(function(s){
s = s.toString();
if(s.match(r)) {
console.log(s);
}
});
console.log("\nMethod 4");
nums.forEach(function(s){
s = s.toString();
if(!s.startsWith("2")) {
console.log(s);
}
});
console.log("\nMethod 5");
nums.forEach(function(s){
s = s.toString();
if(s[0] !== "2") {
console.log(s);
}
});
console.log("\nMethod 6");
nums.forEach(function(s){
var n = Math.abs(s);
while(n >= 10) {
n = Math.floor(n/10);
}
if(n !== 2) {
console.log(s);
}
});

200
302
301
201
205
500
302
301
500
注意:我的答案中的所有正则表达式都使用\b
(字边界)来确保数字的开头。您可以根据需要更换它。例如,如果输入是多行的,您可能希望将^
(行开头断言)与多行标志(通常为m
)一起使用。以下解释不包括\b
令牌的解释(因为我已经解释过了)。
[013-9]
匹配集合中的字符(0,1或3-9范围内的数字)(?!2)\d
否定前瞻确保后续内容不是2。[^\D2]
匹配不在集合中的任何字符(任何非数字或2)。请注意,[^\D2]
实际上是双重否定,表示匹配任何数字,不包括2 语法
str.startsWith(searchString[, position])
参数
searchString
- 在此字符串开头搜索的字符。
position
可选
- 此字符串中开始搜索
searchString
的位置;默认为0。返回值
true
如果在开头找到给定的字符 串;否则,false
。描述
此方法可让您确定字符串是否以字符串开头 另一个字串。此方法区分大小写。
此方法只是取一个数字中的第一个数字,并根据字符串2
对其进行测试,看它们是否匹配。返回任何返回false
的内容(不以2
开头)。
此方法获取数字Math.abs()
的绝对值,然后连续将数字除以10,同时删除小数位(Math.floor(n/10)
),直到数字小于10.然后检查结果数字2
以确保它与if(n !== 2)
不匹配。