代码之家  ›  专栏  ›  技术社区  ›  Mond Wan

mac地址上的Javascript正则表达式

  •  2
  • Mond Wan  · 技术社区  · 11 年前

    假设我有一个mac地址列表,例如:“00:11:22:33:44:55,11:22:33:34:55:66,22:33:445: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会返回真值吗? 此外,当我打字时 re.test(t11) 在chrome控制台上,我发现结果将在true和false之间切换。有人知道为什么吗?

    2 回复  |  直到 11 年前
        1
  •  5
  •   Brigham    11 年前

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

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

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

    具体来说,您存储在 re 变量具有 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 No match!
             ^ Since there was no match, lastIndex is reset to 0.
        t4:  11:22:33:44:55:66,haha
                               ^
        t5:  11:22:33:44:55:66, No match!
             ^ 
        t6:  123123123123 No match!
             ^
        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 No match!
             ^
        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,wahaa No match!
             ^
    
        2
  •  3
  •   Samuel O'Malley    11 年前

    您需要使用 ^ 线路锚的开始,以及 $ 线锚末端。您的测试只验证字符串 包含 一个正确的匹配,而不是 整体 字符串是正确的。

    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 我使用使正则表达式不区分大小写 i 标志,还添加了 - 因为有时MAC地址是这样写的: 3D-F2-C9-A6-B3-4F