2011-03-10 84 views
0

我有一個具有多個MAC地址的字符串。除了00:00:00:00:00:00之外,我如何匹配所有MAC?正則表達式 - 匹配除00:00:00:00:00:00之外的所有MAC地址

我用它來匹配MAC的正則表達式:

((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}) 
+2

爲什麼你就不能有第二正則表達式做呢? – 2011-03-10 23:49:22

+7

你需要一個正則表達式來比較一個確切的值嗎?怎麼樣regex.Match(strInput)&& strInput!=「00:00:00:00:00:00」? – 2011-03-10 23:56:08

+0

使用2個正則表達式的條件可能比一個大的正則表達式要少得多計算密集度 – drapkin11 2011-03-10 23:59:17

回答

3

坦率地說,我建議兩個部分做。首先使用您的正則表達式獲取所有單獨的地址,然後從列表中刪除任何已清零的地址。這是...

  1. 最有可能少計算量很大,並且
  2. 更容易閱讀和維護不是一個正則表達式的大量雜牌。
+0

thx。這是我要做的方式 – Trev 2011-03-11 01:04:52

+0

或者你可以有一個由兩部分組成的正則表達式,第一部分只匹配零MAC,然後你可以有兩個捕獲,如果MAC是全部如果它不是全零,第一個捕獲將是空的,第二個捕獲將會有東西。 – 2011-03-11 05:43:23

1

這是一種模式,你需要做的是:

(?!(?:00[:-]){5}00)((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2})

編輯 - 回答@崔佛的「你怎麼可以這樣」

use strict; use warnings; 

my @samps = (
'MATCH_ME mac1=11:22:33:44:55:66 mac2=00:11:22:33:44:55', 
'MATCH_ME mac1=00:00:00:00:00:00 mac2=00:11:22:33:44:55', 
'MATCH_ME mac1=11:22:33:44:55:66 mac2=00:00:00:00:00:00', 
'MATCH_ME mac1=00:00:00:00:00:00 mac2=00:00:00:00:00:00', 
); 

for (@samps) { 

    if (/(MATCH_ME)\s* 
      mac1= 
       ( (?!(?:00[:-]){5}00) 
        (?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2} 
       | 
      ) 
       .*? 
      mac2= 
       ( (?!(?:00[:-]){5}00) 
        (?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2} 
       | 
      ) 
     /x) 
    { 
    print "'$1'\n"; 
    print "'$2'\n"; 
    print "'$3'\n",'-'x20,"\n"; 
    } 
} 

輸出

'MATCH_ME'
'11:22:33:44:55:66'
'00:11:22:33:44:55'
--------------------
'MATCH_ME'
''
'00:11:22:33:44:55'
--------------------
'MATCH_ME'
'11:22:33:44:55:66'
''
--------------------
'MATCH_ME'
''
''

+0

好了!現在我將如何使用它返回「MATCH_ME」 MA (請記住,要麼可能是零mac): 'MATCH_ME mac1 = 11:22:33:44:55:66 mac2 = 00:11:22:33:44:55' – Trev 2011-03-11 01:40:13

+1

@ Trev這只不過是編程而已。這是'(MATCH_ME)\ s * mac1 =((?!(?: 00 [: - ]){5} 00)(?:[0-9a-f] {2} [: - ] ){5} [0-9A-F] {2} |)* MAC2 =(((?: 00 [: - ]?!){5} 00)(:[0-9A-F] {2。? } [0-9a-f] {2} |)'但是我會格式化它,使它像我上面的例子那樣可讀。 – sln 2011-03-11 20:23:42

相關問題