簡體   English   中英

Mac地址上的Javascript正則表達式

[英]Javascript regular expression on mac address

假設我有一個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? 而且,當我在chrome控制台上鍵入re.test(t11)時,我發現結果將在true和false之間切換。 誰知道為什么?

由於您的正則表達式已經設計為匹配字符串中的所有mac地址(而不是一次只匹配一個),因此可以通過刪除g標志來修復此錯誤。 另外,為了防止僅匹配字符串的一部分,您需要在正則表達式的開頭和結尾包含^$字符。

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

因為您正在使用全局正則表達式(由於末尾的g ),正則表達式會保持狀態有關其最后一次匹配,這將影響將來的匹配。

具體來說,存儲在re變量中的RegExp對象具有lastIndex ,該lastIndex被更新為指向每次匹配后的第一個字符。 即使您匹配新字符串,也會從該索引開始執行將來的匹配。 匹配失敗后, lastIndex將重置為0

從圖形re.lastIndex ,這是匹配的,每次匹配后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!
         ^

您需要使用^ start of line anchor和$ End of line anchor。 您的測試僅驗證字符串是否包含正確的匹配,而不是整個字符串是否正確。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM