O que é uma expressão regular para um endereço MAC?

125

Neste formato:

3D:F2:C9:A6:B3:4F

ou:

3D-F2-C9-A6-B3-4F
Xaisoft
fonte

Respostas:

266

O formato padrão (IEEE 802) para impressão de endereços MAC-48 em formato compatível com humanos é de seis grupos de dois dígitos hexadecimais, separados por hífens -ou dois pontos :.

Assim:

^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
codificador de rede
fonte
21
Nota que, se eles estão sendo armazenados com minúsculas letras hexadecimais não irá corresponder a alterar o grupo para [0-9A-Fa-f] para pegar ambos os casos
Scott Chamberlain
5
você provavelmente também quer ignorar a caixa
dietbuddha 23/11/10
5
^ ([0-9A-Fa-f] {2} [: -]) {5} ([0-9A-Fa-f] {2}) $
Rajavel D
2
Como um aparte, a citação acima referente ao "formato padrão" vem da Wikipedia, não do corpo de padrões 802.3. O IEEE 802-2014 na verdade especifica hífens para endereços MAC comuns (§ 8.1 ¶ 3) e dois pontos para a notação obsoleta de reversão de bits (. 4). Importante, na prática, ninguém observa isso . Simplesmente usamos um ou outro, mas nunca os misturamos em um único MAC escrito.
Pilcrow
1
Não acho que esse RegEx esteja correto, pois também classifica '3D-F2-C9: A6-B3: 4F' como um endereço MAC válido, mesmo que não esteja correto. O correto seria: ((([a-zA-z0-9] {2} [-:]) {5} ([a-zA-z0-9] {2})) | (([a- zA-z0-9] {2}:) {5} ([a-zA-z0-9] {2}))) Para que toda vez você possa escolher ':' ou '-' para todo o endereço MAC.
PyFox 5/04/19
23

Um pouco duro para os olhos, mas isso:

/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/

aplicará todos os dois pontos ou todos os hífens para sua notação MAC.

(Uma abordagem mais simples de regex pode permitir A1:B2-C3:D4-E5:F6, por exemplo, que o acima rejeitado).

Pilcrow
fonte
Isso funciona, mas você pode explicar o que é o xdigit? e notei que você colocou o grupo ([-:]) após o comprimento, o que faz com que todos os dois pontos ou hífens sejam usados?
Xaisoft
2
@Xaisoft, :xdigit:é a abreviação de dígito hexadecimal, mais ou menos outra maneira de dizer [a-fA-F0-9]. O \1refere-se ao grupo de captura para o primeiro traço ou dois pontos ([-:])e corresponde apenas ao que correspondeu à primeira vez.
Pilcrow
2
+1 para a utilização de ambos os grupos não-captura captura e de forma adequada, e também para usar :xdigit:(apesar de que "taquigrafia" é apenas mais curto do que [a-fA-F0-9]e equivalente /[a-f0-9]/ié mais curto!)
GB96
@pilcrow você poderia explicar por que esse mac: C8:FD:19:55:E6:3Afalha? É um endereço mac real. Modifiquei seu regex para aceitar :apenas /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/Obrigado!
27519 Sam
1
Na minha opinião, esta é a melhor resposta, pois verifica o uso misto de ":" e "-".
Ray Oei
9

Esse regex corresponde a praticamente todos os formatos Mac, incluindo o Cisco, como 0102-0304-abcd

^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$

Sequências de exemplo correspondentes:

01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd

O formato misto será combinado também!

Vesselin Yanev
fonte
Isso corresponderá aos separadores após qualquer um dos cinco primeiros octetos, o que significa que ele aceitará aa.aa.bbbb.cccc, por exemplo.
Pilcrow
1
#notAllFormats Se você tiver acesso a um sistema OSX com Wi-Fi, execute /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I, e olhar para a linha BSSID, se houver octeto está sob 0x10 zero à esquerda é descartado ( %xou %2xem vez de %02x printfformato usado?)
nhed
8

delimitador: " : ", " - ", " . "

duplo ou único: 00 = 0, 0f = f

/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i

ou

/^([0-9a-F]{1,2}[\.:-]){5}([0-9a-F]{1,2})$/


exm: 00:27:0e:2a:b9:aa, 00-27-0E-2A-B9-AA, 0.27.e.2a.b9.aa ...
Filhote de leão
fonte
2
O segundo corresponderá incorretamente às seqüências que contêm caracteres não hexadecimais, como g.
Php binário
O segundo não é válido na maioria dos tipos, exceto no BRE / ERE, que suporta o agrupamento de caracteres. No entanto, o suporte ao agrupamento de caracteres varia de acordo com a implementação; portanto, o resultado pode variar.
Nhhtdh 6/15
Outra coisa é que os grupos devem ter exatamente 2 dígitos hexa.
Nhahtdh 6/05
Em teoria, todos os endereços MAC retornados por programas em ambiente selvagem seguiriam alguns padrões, como 2 dígitos hexadecimais em cada grupo separado. No entanto, algumas variantes Unix não padronizadas diminuem a saída quando há um zero inicial, deixando apenas 1 caractere hexadecimal em alguns casos. Daí a necessidade da {1,2}regex
TrinitronX
No entanto, o conjunto de caracteres de [0-9a-F]provavelmente deve ser reescrito como:[0-9a-fA-F]
TrinitronX 30/06
5

Esteja avisado de que a propriedade Unicode \p{xdigit}inclui as versões FULLWIDTH. Você pode preferir \p{ASCII_Hex_Digit}.

A resposta para a pergunta pode ser melhor respondida - desde que você tenha um determinado módulo CPAN venerável instalado - digitando:

% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'

Mostro o padrão específico que ele gera aqui como padrão de sorte número 13; existem muitos outros.

Este programa:

#!/usr/bin/env perl
use 5.010;
use strict;
use warnings qw<FATAL all>;

my $mac_rx = qr{
    ^ (?&MAC_addr) $
    (?(DEFINE)
        (?<MAC_addr>
                (?&pair) (?<it>  (?&either) )
            (?: (?&pair) \k<it> ) {4}
                (?&pair)
        )
        (?<pair>    [0-9a-f] {2} )
        (?<either>  [:\-]        )
    )
}xi;

while (<DATA>) {
    chomp;
    printf("%-25s %s\n", $_ => /$mac_rx/ ? "ok" : "not ok");
}

__END__
3D:F2:C9:A6:B3:4F
3D:F2:AC9:A6:B3:4F
3D:F2:C9:A6:B3:4F:00
:F2:C9:A6:B3:4F
F2:C9:A6:B3:4F
3d:f2:c9:a6:b3:4f
3D-F2-C9-A6-B3-4F
3D-F2:C9-A6:B3-4F

gera esta saída:

3D:F2:C9:A6:B3:4F         ok
3D:F2:AC9:A6:B3:4F        not ok
3D:F2:C9:A6:B3:4F:00      not ok
:F2:C9:A6:B3:4F           not ok
F2:C9:A6:B3:4F            not ok
3d:f2:c9:a6:b3:4f         ok
3D-F2-C9-A6-B3-4F         ok
3D-F2:C9-A6:B3-4F         not ok

Qual parece o tipo de coisa que você está procurando.

tchrist
fonte
5

Este link pode ajudá-lo. Você pode usar isto:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})

Manohar Bhattarai
fonte
4

Veja esta pergunta também.

Regexa da seguinte maneira:

^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$

^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$
JYelton
fonte
1
Não existe uma maneira de reduzi-lo fazendo grupos? e como posso combinar a regex para ter a: ou a - sem ter duas expressões regulares separadas?
Xaisoft 23/11
A forma abreviada que o netcoder fornece também funcionará. O uso de um ou de outro pode ser baseado na necessidade de capturar algum endereço MAC ou apenas validá-lo em geral.
JYelton
Ele precisa ser validado em geral, portanto, se contém todos os hífens ou todos os dois pontos. Se ele contiver uma mistura, não é um MAC válido.
Xaisoft
2
@ Xaisoft: Como eu disse no comentário da minha resposta, misturar dois pontos e hífens é válido de acordo com a especificação.
Netcoder
De que fonte você está obtendo endereços MAC e que pode ter uma mistura de delimitadores? Se eles vierem de uma máquina / NIC real, você provavelmente não terá esse problema. Se forem dados inseridos pelo usuário, basta executar uma substituição de sequência para tornar todos os delimitadores consistentes.
JYelton
2
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
bcosca
fonte
É semelhante à resposta de pilcrow, apenas sem o: xdigit?
Xaisoft 23/11
2

A versão python pode ser:

re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)
Juan Diego Godoy Robles
fonte
2
/^(([a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$/

O regex acima valida todos os tipos de endereços mac abaixo:

01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
Mohammed Réda OUASSINI
fonte
Eu acho que este é o único que está completo e correto.
Vincent Sels
1

para desenvolvedor PHP

filter_var($value, FILTER_VALIDATE_MAC)
Saurabh Chandra Patel
fonte
1

Não acho que o principal RegEx esteja correto, pois também classifica

'3D-F2-C9:A6-B3:4F' 

como um endereço MAC válido, mesmo que não esteja correto. O correto seria:

((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))

Para que toda vez você possa escolher ':' ou '-' para todo o endereço MAC.

PyFox
fonte
0

Você pode usar o procedimento a seguir, passando o endereço mac para validação,

private static final String MAC_PATTERN = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$";

private boolean validateMAC(final String mac){          
    Pattern pattern = Pattern.compile(MAC_PATTERN);
    Matcher matcher = pattern.matcher(mac);
    return matcher.matches();             
}
Hari Babu Mandala
fonte
0

Gente do PHP:

print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));

Necessita de explicação: http://regex101.com/r/wB0eT7

bn00d
fonte
0

Se você precisar de espaços entre números, como esta variante

3D : F2 : C9 : A6 : B3 : 4F

O regex muda para

"^([0-9A-Fa-f]{2}\\s[:-]\\s){5}([0-9A-Fa-f]{2})$"
RexSplode
fonte
0

para corresponder aos endereços MAC EUI-48 e EUI-64 de 64 bits:

/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/

onde \ h é um caractere em [0-9a-fA-F]

ou:

/\A[0-9a-fA-F]{2}([:\-]?[0-9a-fA-F]{2}){5}\z|\A[0-9a-fA-F]{2}([:\-]?[0-9a-fA-F]{2}){7}\z/

isso permite que '-' ou ':' ou nenhum separador seja usado

Tilo
fonte
0

Talvez o mais curto possível:

/([\da-f]{2}[:-]){5}[\da-f]{2}/i

Atualização : Existe uma maneira melhor de validar endereços MAC em PHP, que suporta endereços MAC com hífen e dois pontos. Use filter_var () :

// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);

Como eu sei, ele suporta endereços MAC nessas formas (x: um número hexadecimal):

xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
MAChitgarha
fonte
0

Muito obrigado a @Moshe pela ótima resposta acima. Depois de fazer mais algumas pesquisas, gostaria de adicionar minhas descobertas extras, tanto no que diz respeito ao IEEE 802 quanto na aplicação consistente do uso de separadores no regex.

O formato padrão (IEEE 802) para impressão de endereços MAC-48 em formato compatível com humanos é de seis grupos de dois dígitos hexadecimais, separados por hífens - . No entanto, é uma convenção amplamente adotada também permitir dois pontos:, e três grupos de quatro dígitos hexadecimais separados por pontos. .

Crédito total para @Moshe aqui por sua declaração inicial e para @pilcrow por apontar que o IEEE 802 cobre apenas hypens.

Aqui está um regex que impõe que o mesmo separador seja usado em todo o endereço mac:

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$

Demonstração Regex101

E aqui está outro adicional que permite o uso de nenhum separador:

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$

Demonstração Regex101

Robert Axelsen
fonte
0

Como um endereço MAC pode ter 6 ou 20 bytes (banda infinita, ...), a resposta correta é:

^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$

você pode substituir: por [: -.]? se você quiser separadores diferentes ou nenhum.

Olivier LAHAYE
fonte
-1

Este é um pequeno:

(([0-9A-F]{2}[:-]?){6})

Tenha em mente que essa mistura estranha de vários caracteres ou separadores pode passar.

esguti
fonte
-4

a melhor resposta é para regex de validação de endereço mac

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
Rittika Nagar
fonte