2011-03-10 4 views
0

J'ai une chaîne avec plusieurs adresses MAC. Comment puis-je faire correspondre tous les MAC, sauf 00: 00: 00: 00: 00: 00?RegEx - Correspond à toutes les adresses MAC sauf 00: 00: 00: 00: 00: 00

Le regex-je utiliser pour correspondre à un MAC:

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

Pourquoi ne pouvez-vous le faire avec une seconde regex? –

+7

Avez-vous besoin d'une regex pour comparer une valeur exacte? Que diriez-vous d'où regex.Match (strInput) && strInput! = "00: 00: 00: 00: 00: 00"? –

+0

l'utilisation de conditionnels avec 2 regex est probablement moins intensive en calcul qu'une grosse regex qui devra être évaluée pour chaque cas – drapkin11

Répondre

3

Franchement, je vous conseille de faire en deux parties. Commencez par récupérer toutes les adresses individuelles à l'aide de votre expression régulière, puis supprimez simplement les adresses mises à zéro de la liste. C'est ...

  1. Très probablement moins cher informatiquement, et
  2. beaucoup plus facile à lire et à maintenir qu'un bidouille massif d'une expression régulière.
+0

thx .Ceci est la façon dont je vais le faire – Trev

+0

Ou vous pouvez avoir une regex en deux parties.La première partie ne correspondant à zéro MAC.Vous pouvez alors avoir deux captures.Si le MAC est tout -Zero, la première capture aura des choses dans le jeu. Si ce n'est pas tout-zéro, la première capture sera vide et la seconde capture aura des choses –

1

C'est le modèle que vous devez faire:

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

Modifier - une réponse à son @ Trev « comment pourriez-vous faire »

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"; 
    } 
} 

sortie

'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

bien! Maintenant, comment puis-je utiliser cela pour retourner "MATCH_ME" et les deux le ma Cs dans ceci (en gardant à l'esprit que l'un ou l'autre pourrait être le zéro-mac): 'MATCH_ME mac1 = 11: 22: 33: 44: 55: 66 mac2 = 00: 11: 22: 33: 44: 55' – Trev

+1

@ Trev c'est juste programmer à gauche comme un exercice.Ceci est la réponse à comment '(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} |) 'Mais je le formaterais pour le rendre lisible comme mon exemple ci-dessus. – sln

Questions connexes