Respostas:
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})$
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).
: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.
:xdigit:(apesar de que "taquigrafia" é apenas mais curto do que [a-fA-F0-9]e equivalente /[a-f0-9]/ié mais curto!)
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!
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!
aa.aa.bbbb.cccc, por exemplo.
/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?)
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 ...
{1,2}regex
[0-9a-F]provavelmente deve ser reescrito como:[0-9a-fA-F]
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.
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})
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}$
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
A versão python pode ser:
re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)
/^(([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
para desenvolvedor PHP
filter_var($value, FILTER_VALIDATE_MAC)
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.
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();
}
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
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
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
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}))$
E aqui está outro adicional que permite o uso de nenhum separador:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
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.
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])$