2

假设我有一个mac地址列表,例如:“00:11:22:33:44:55,11:22:33:44:55:66,22:33:44:55:66:77”

我想对该列表进行正则表达式检查。

var re = /(([A-Fa-f0-9]{2}[:]){5}[A-Fa-f0-9]{2}[,]?)+/g

但是,它不起作用。这是输入测试。

var t1 = "11:22:33:44:55:66";
var t2 = t1 + ",12:22:33:44:55:66";
var t3 = t1 + ",11asdfasdf:22:33:44:55:66";
var t4 = t1 + ",haha";
var t5 = t1 + ",";
var t6 = "123123123123";
var t7 = t1 + ",33:44:55:66:77:88:";
var t8 = t1 + ",33:44:55:66:77:88asdfasdfasdfasdfasdfasd";
var t9 = t1 + ",dfasdfasdfasdfasdfasd";
var t10 = t2 + ",12:33:44:55:66:77";
var t11 = t2 + ",wahaa";

console.log("t1: [" + t1 + "] " + re.test(t1));
console.log("t2: [" + t2 + "] " + re.test(t2));
console.log("t3: [" + t3 + "] " + re.test(t3));
console.log("t4: [" + t4 + "] " + re.test(t4));
console.log("t5: [" + t5 + "] " + re.test(t5));
console.log("t6: [" + t6 + "] " + re.test(t6));
console.log("t7: [" + t7 + "] " + re.test(t7));
console.log("t8: [" + t8 + "] " + re.test(t8));
console.log("t9: [" + t9 + "] " + re.test(t9));
console.log("t10: [" + t10 + "] " + re.test(t10));
console.log("t11: [" + t11 + "] " + re.test(t11));   

结果

t1: [11:22:33:44:55:66] true 
t2: [11:22:33:44:55:66,12:22:33:44:55:66] true 
t3: [11:22:33:44:55:66,11asdfasdf:22:33:44:55:66] false 
t4: [11:22:33:44:55:66,haha] true 
t5: [11:22:33:44:55:66,] false 
t6: [123123123123] false 
t7: [11:22:33:44:55:66,33:44:55:66:77:88:] true 
t8: [11:22:33:44:55:66,33:44:55:66:77:88asdfasdfasdfasdfasdfasd] false 
t9: [11:22:33:44:55:66,dfasdfasdfasdfasdfasd] true 
t10: [11:22:33:44:55:66,12:22:33:44:55:66,12:33:44:55:66:77] true
t11: [11:22:33:44:55:66,12:22:33:44:55:66,wahaa] false

谁能告诉我为什么 t7、t9 和 t4 会返回 true?此外,当我re.test(t11)在 chrome 控制台上输入时,我发现结果会在真假之间切换。有谁知道为什么?

4

2 回答 2

5

由于您的正则表达式已经设计为匹配字符串中的所有 mac 地址(而不是一次只匹配一个),您可以通过删除g标志来修复此错误。此外,为了防止只匹配字符串的一部分,您需要在正则表达式的开头和结尾包含^and字符。$

var re = /^(([A-Fa-f0-9]{2}[:]){5}[A-Fa-f0-9]{2}[,]?)+$/

因为您使用的是全局正则表达式(由于g结尾处的),所以正则表达式会保持其最后一次匹配的状态,这将影响未来的匹配。

具体来说,您存储在re变量中的 RegExp 对象有一个lastIndex更新为指向每次匹配后的第一个字符。即使您匹配新字符串,也会从该索引开始执行未来的匹配。一旦匹配失败,lastIndex将重置为0

从图形上看,这是匹配的内容以及re.lastIndex每次匹配后的点:

    t1:   11:22:33:44:55:66
                          ^
    t2: 11:22:33:44:55:66, 12:22:33:44:55:66
                                            ^
    t3: 11:22:33:44:55:66,11asdfasdf:22:33:44:55:66不匹配!
         ^由于没有匹配,lastIndex 被重置为
    0。t4:   11:22:33:44:55:66,哈哈
                           ^
    t5: 11:22:33:44:55:66,不匹配!
         ^
    t6:123123123123不匹配!
         ^
    t7:   11:22:33:44:55:66,33:44:55:66:77:88:
                                            ^
    t8: 11:22:33:44:55:66,33:44:55:66:77:88asdfasdfasdfasdfasdfasd不匹配!
         ^
    t9:   11:22:33:44:55:66, dfasdfasdfasdfasdfasd
                           ^
    t10: 11:22:33:44:55:66, 12:22:33:44:55:66,12:33:44:55:66:77
                                                              ^
    t11: 11:22:33:44:55:66,12:22:33:44:55:66,哇哈哈不匹配!
         ^
于 2013-10-30T04:01:52.747 回答
3

您需要使用^线锚的起点和线的$终点锚。您的测试仅验证字符串是否包含正确的匹配项,而不是整个字符串是否正确。

var str = 'This is a sentence';
var re = /e/;
re.test(str); // returns true

var re2 = /^e$/;
re2.test(str); // returns false
re2.test("e"); // returns true

为了让您得到最准确的答案,我建议:

  1. 拆分“,”str.split(",")以获取候选 MAC 地址数组
  2. 将数组的每个元素与以下修改的正则表达式匹配: 我使用标志var re = /^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/i 使正则表达式不区分大小写,并且还添加了一个,因为有时 MAC 地址是这样写的:i-3D-F2-C9-A6-B3-4F
于 2013-10-30T03:59:22.993 回答