Respuestas:
El formato estándar (IEEE 802) para imprimir direcciones MAC-48 en forma amigable para los humanos es seis grupos de dos dígitos hexadecimales, separados por guiones
-
o dos puntos:
.
Entonces:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
Un poco duro para los ojos, pero esto:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
aplicará todos los dos puntos o todos los guiones para su notación MAC.
(Un enfoque de expresión regular más simple podría permitir A1:B2-C3:D4-E5:F6
, por ejemplo, lo que rechaza lo anterior).
:xdigit:
es la abreviatura de dígito hexadecimal, más o menos otra forma de decir [a-fA-F0-9]
. Se \1
refiere al grupo de captura para el primer guión o dos puntos ([-:])
, y solo coincide con lo que coincidió esa primera vez.
:xdigit:
(a pesar de que "abreviada" no ha hecho más corto que [a-fA-F0-9]
y equivalentes /[a-f0-9]/i
es más corta!)
C8:FD:19:55:E6:3A
falla? Es una dirección mac real. Modifiqué tu expresión regular para aceptar :
solo /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
¡Gracias!
Esta expresión regular coincide con casi todos los formatos de Mac, incluido el formato de Cisco, como 0102-0304-abcd
^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$
Cadenas de ejemplo con las que coincide:
01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd
¡El formato mixto también coincidirá!
aa.aa.bbbb.cccc
, por ejemplo.
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
y busque la línea BSSID, si algún octeto está por debajo de 0x10, el cero inicial se descarta (¿ %x
o %2x
no se %02x
printf
utiliza el formato?)
delimitador: " : ", " - ", " . "
doble o simple: 00 = 0, 0f = f
/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i
o
/^([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}
expresión regular
[0-9a-F]
probablemente debería reescribirse como:[0-9a-fA-F]
Tenga en cuenta que la propiedad Unicode \p{xdigit}
incluye las versiones FULLWIDTH. Quizás prefieras en su \p{ASCII_Hex_Digit}
lugar.
La respuesta a la pregunta formulada podría ser la mejor respuesta, siempre que tenga un cierto módulo CPAN venerable instalado, escribiendo:
% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'
Muestro el patrón particular que muestra aquí como patrón de suerte número 13; Hay muchos otros.
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
genera esta salida:
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
Que parece el tipo de cosa que estás buscando.
Este enlace puede ayudarte. Puedes usar esto:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})
Ver esta pregunta también.
Regexes de la siguiente manera:
^[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})/
La versión de Python podría 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})?$/
La expresión regular anterior valida todos los tipos de direcciones mac a continuación:
01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
para desarrollador PHP
filter_var($value, FILTER_VALIDATE_MAC)
No creo que el RegEx principal sea correcto, ya que también clasifica
'3D-F2-C9:A6-B3:4F'
como una dirección MAC válida, aunque no sea correcta. El correcto sería:
((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))
Para que cada vez pueda elegir ':' o '-' para toda la dirección MAC.
Puede usar el siguiente procedimiento pasando la dirección mac para la validación,
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 PHP:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
Necesidad de explicación: http://regex101.com/r/wB0eT7
para que coincidan con las direcciones MAC EUI-48 de 48 bits y EUI-64 de 64 bits:
/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/
donde \ h es un carácter en [0-9a-fA-F]
o:
/\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/
esto permite '-' o ':' o ningún separador para ser utilizado
Quizás lo más corto posible:
/([\da-f]{2}[:-]){5}[\da-f]{2}/i
Actualización : existe una mejor manera de validar las direcciones MAC en PHP que admite direcciones MAC con guiones y con dos puntos. Use filter_var () :
// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);
Como sé, admite direcciones MAC en estas formas (x: un número hexadecimal):
xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
Muchas gracias a @Moshe por la excelente respuesta anterior. Después de investigar un poco más, me gustaría agregar mis hallazgos adicionales, tanto en lo que respecta a IEEE 802 como a imponer el uso de separadores consistentes en expresiones regulares.
El formato estándar (IEEE 802) para imprimir direcciones MAC-48 en forma amigable para los humanos es seis grupos de dos dígitos hexadecimales, separados por guiones . Sin embargo, es una convención ampliamente adoptada para permitir también dos puntos: y tres grupos de cuatro dígitos hexadecimales separados por puntos. .
Todo el crédito a @Moshe aquí por su declaración inicial, y a @pilcrow por señalar que IEEE 802 solo cubre bombo.
Aquí hay una expresión regular que impone que el mismo separador se use en toda la dirección mac:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$
Y aquí hay uno adicional que permite el uso de ningún separador:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
Como una dirección MAC puede tener 6 o 20 bytes (infiniband, ...) la respuesta correcta es:
^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$
puede reemplazar: con [: -.]? si quieres separadores diferentes o ninguno.
la mejor respuesta es para regex de validación de dirección mac
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$